iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >完全解决FTP上传文件名称中文乱码问题
  • 831
分享到

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

服务器java运维 2023-08-21 10:08:17 831人浏览 薄情痞子
摘要

完全解决FTP上传文件名称中文乱码问题 说明无效踩坑经历 有效解决方法定时上传文件至ftp样例 说明 今天项目上加了个定时扫描本地文件路径下所有文件实现自动上传至ftp文件服务器的功能,经测试发现一旦上传中文名称的文件

完全解决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

--结束END--

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

本文链接: https://www.lsjlt.com/news/376852.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作