Java ftp 上传文件名乱码

Java ftp 上传文件名乱码场景描述:在系统中生成xml上传到指定目录中 定时监控指定目录,读取目录中文件,解析,执行业务操作后,将文件移动到指定目录。废话没有,直接上代码。1.上传此处的处理没有生成文件后,将文件再上传,而是直接生成好xml格式字符串后,转换为流上传。//设置编码ftpClient.setControlEncoding("UTF-8");ftpClient.enterLocalPassiveMode();

场景描述:

  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.获取目录下所有文件夹名称

此代码由Java架构师必看网-架构君整理
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.移动文件, 删除文件、删除目录等操作失败, 多数也是因为中文名称乱码导致。此处不再多说。

名称处理的方法:

此代码由Java架构师必看网-架构君整理
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"); }

 

架构君码字不易,如需转载,请注明出处:https://javajgs.com/archives/165882
0

发表评论