Java ftp 上传文件名乱码

场景描述:

  1. 在系统中生成xml上传到指定目录中
  2. 定时监控指定目录,读取目录中文件,解析,执行业务操作后,将文件移动到指定目录。

废话没有,直接上代码。

1.上传

此处的处理没有生成文件后,将文件再上传,而是直接生成好xml格式字符串后, 转换为流上传。

            // 设置编码
            ftpClient.setControlEncoding("UTF-8");
            ftpClient.enterLocalPassiveMode();
            // 创建目录, 如果目录已存在, 则返回false, 如果目录不存在就创建并返回true
            boolean makeDirectory = ftpClient.makeDirectory(formatPathName(pathName));            
            for (Entry<String, InputStream> entry : map.entrySet()) {
                String fn = entry.getKey();
                InputStream fin = entry.getValue();
                // 执行上传
                result = ftpClient.storeFile(formatPathName(fn), fin);
                if (!result) {
                    log.error(String.format("----FTP文件[%s]上传失败----", fn));
                    return false;
                }
            }

上传时遇到的问题:

  • 一开始ftpClient.setControlEncoding("UTF-8"); 编码设置的是GBK,上传也正常。用记事本打开xml文件中文也没有乱码,但是当用浏览器打开文件是就是乱码,无法预览,搞的很郁闷。因为没有乱码, 也没想到是这个地方编码的问题。然后各种搜,也没有找到跟我类似的问题, 但是看到有的例子里面用的是UTF-8, 我也就试着改了一下。然后,就可以了。

 

 

2.获取目录下所有文件夹名称

        ftpClient.setControlEncoding("UTF-8");
        ftpClient.enterLocalPassiveMode();
        FTPFile[] ftpFiles = ftpClient.listFiles();
        List<String> retList = new ArrayList<String>();
        if (ftpFiles == null || ftpFiles.length == 0) {
            return retList;
        }
        for (FTPFile ftpFile : ftpFiles) {
            // 判断是否时目录
            if (ftpFile.isDirectory()) {
                retList.add(new String(ftpFile.getName().getBytes("UTF-8")));
            }
        }
        return retList;

此处问题同样是乱码问题,如代码中设置即可解决。

3.获取文件内容

        ftpClient.setControlEncoding("UTF-8");
        ftpClient.enterLocalPassiveMode();
        FTPFile[] ftpFiles = ftpClient.listFiles(formatPathName(fileName));
        List<String> retList = new ArrayList<String>();
        if (ftpFiles == null || ftpFiles.length == 0) {
            return retList;
        }

        System.out.println("------------------ " + fileName + " 读取文件  开始 --------------------------");
        InputStream retrieveFileStream = ftpClient.retrieveFileStream(formatPathName(fileName));
        BufferedReader br = new BufferedReader(new InputStreamReader(retrieveFileStream, "GB2312"));// 构造一个BufferedReader类来读取文件
        String s = null;
        while ((s = br.readLine()) != null) {// 使用readLine方法,一次读一行
            retList.add(s);
        }
        br.close();
        retrieveFileStream.close();
        ftpClient.completePendingCommand();
        System.out.println("------------------ " + fileName + " 读取文件  结束 --------------------------");
        return retList;

此处遇到问题:

  • 1.获取文件内容是, 是乱码。经过多次尝试, new InputStreamReader(retrieveFileStream, "GB2312")要使用GB2312.
  • 2.循环获取文件按内容是, 第一个文件读取完成后就停止了, 并没有继续往下执行。查了一下是被阻塞,需添加 ftpClient.completePendingCommand();

4.移动文件, 删除文件、删除目录等操作失败, 多数也是因为中文名称乱码导致。此处不再多说。

名称处理的方法:

 private String formatPathName(String str) throws UnsupportedEncodingException {
        // return new String(str.getBytes("GBK"), "iso-8859-1");
        return new String(str.getBytes("UTF-8"), "iso-8859-1");
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值