文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

完全解决FTP上传文件名称中文乱码问题

2023-08-21 10:31

关注

完全解决FTP上传文件名称中文乱码问题

说明

今天项目上加了个定时扫描本地文件路径下所有文件实现自动上传至ftp文件服务器的功能,经测试发现一旦上传中文名称的文件就会乱码或者文件上传不了。初步排查就是FTP服务器字符编码的问题。在网上查了很多资料都没有效果。在这里讲一下我踩过的坑,以及分享我能上传成功的样例。

无效踩坑经历

public static String encodingUTF8(String path) throws UnsupportedEncodingException {        return new String(path.getBytes("UTF-8"), "ISO-8859-1");    }    public static String encodingGBK(String path) throws UnsupportedEncodingException {        return new String(path.getBytes("GBK"), "ISO-8859-1");    }    

请添加图片描述

有效解决方法

思路:设置ftp支持UTF-8, ftpClient.sendCommand(“OPTS UTF8”, “ON”),核心代码如下

//链接至ftp服务器,设置编码格式 Ftp ftp = new Ftp(url, 21, username, password);//开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就用本地编码(ISO-8859-1)if (FTPReply.isPositiveCompletion(ftp.getClient().sendCommand("OPTS UTF8", "ON"))) {    ftp.getClient().setControlEncoding("UTF-8");} else {   //FTP协议里面,规定文件名编码为iso-8859-1    ftp.getClient().setControlEncoding("ISO-8859-1");}

定时上传文件至ftp样例

引用工具组件:hutool

package cn.dexter.filesync;import cn.dexter.filesync.metadata.sync.util.PropertiesUtils;import cn.hutool.core.io.FileUtil;import cn.hutool.core.io.IORuntimeException;import cn.hutool.core.util.StrUtil;import cn.hutool.extra.ftp.Ftp;import org.apache.commons.net.ftp.FTPReply;import java.io.File;import java.time.Duration;import java.time.LocalDateTime;import java.util.List;public class FtpUploadThread extends Thread {    String url = PropertiesUtils.getString("ftp.url");    String username = PropertiesUtils.getString("ftp.username");    String password = PropertiesUtils.getString("ftp.password");        String messageLocalPath = PropertiesUtils.getString("file.localPath");        String svrTopic = PropertiesUtils.getString("svrTopic");    @Override    public void run() {        try {            List fileList = FileUtil.loopFiles(messageLocalPath);            if (fileList.size() > 0) {                LocalDateTime starttime = LocalDateTime.now();                Ftp ftp = new Ftp(url, 21, username, password);                //开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就用本地编码(ISO-8859-1)                if (FTPReply.isPositiveCompletion(ftp.getClient().sendCommand("OPTS UTF8", "ON"))) {                    ftp.getClient().setControlEncoding("UTF-8");                } else {                   //FTP协议里面,规定文件名编码为iso-8859-1                    ftp.getClient().setControlEncoding("ISO-8859-1");                }                //设置被动模式                ftp.getClient().enterLocalActiveMode();                for (File file : fileList) {                    if (file.isFile()) {                        //每次上传后切换操作路径为根路径                        ftp.cd("/");                        //读取文件绝对路径                        String absolutePath = file.getAbsolutePath().replace("\\", "/");                        String fileName = file.getName();                        //替换ftp服务器远程根路径                        String remotePath = absolutePath.replace(messageLocalPath, "").replace(fileName, "");                        if (StrUtil.isNotBlank(svrTopic)) {//添加服务器主题remotePath = svrTopic + "/" + remotePath;                        }                        try {if (ftp.upload(remotePath, fileName, file)) {    //文件上传成功后,删除本地数据。    FileUtil.del(file);}                        } catch (IORuntimeException e) {System.out.println(String.format("上传文件[%s]失败!", absolutePath));                        }                    }                }                ftp.close();                LocalDateTime endttime = LocalDateTime.now();                Duration duration = Duration.between(starttime, endttime);                System.out.println(String.format(" 本次文件同步耗时:%s分钟 %s秒", duration.toMinutes(), duration.toMillis() / 1000));            }        } catch (Exception e) {            System.out.println(String.format("上传文件至ftp服务器异常:%s", e.getMessage()));        }    }}

来源地址:https://blog.csdn.net/qq_37959253/article/details/129463230

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-服务器
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯