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

这篇具有很好参考价值的文章主要介绍了完全解决FTP上传文件名称中文乱码问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明

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

无效踩坑经历

  • 踩坑1(说明:不一定无效,但是我试了不行)
    本地文件名进行 (UTF-8 ,GBK) 和 ISO-8859-1 的转换

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");
    }
    
  • 踩坑2(说明:不一定无效,但是我试了不行)
    打开IIS服务器,然后找到FTP服务,选择高级配置,把允许utf8改成false

文件上传到ftp文件名乱码,FTP,JAVA,服务器,java,运维

有效解决方法

思路:设置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文章来源地址https://www.toymoban.com/news/detail-643672.html

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;

/**
 * ftp文件上传服务
 * 定时扫描文件路径上传至ftp服务器
 *
 * @author Dexter
 */
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<File> 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()));
        }
    }
}

到了这里,关于完全解决FTP上传文件名称中文乱码问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决idea文件properties中文乱码问题

    有时候将项目代码拉取至本地用idea打开时会出现中文乱码问题,遇到这种问题不要慌,重新设置一下编码为UTF-8即可。那么如何将idea的编码统一设置为UTF-8格式呢?接下来我们一一解决此类问题 有时候会看到打开的文件已经出现了乱码问题,这时有的朋友就开始慌了,不要慌

    2024年02月11日
    浏览(33)
  • 解决DBeaver打开csv文件中文乱码问题

    ①将excel文件进行另存为,保存类型选择【CSV UTF-8】 ②之后在DBeaver进行数据导入,选择【导入数据——选择csv文件——将编码类型手动改为UTF-8】 ③选择下一步,若【表映射——预览数据】中没有出现乱码。大概率会导入成功。 ④若导入完成后,只展示了表结构而没有具体

    2024年01月18日
    浏览(41)
  • 解决.properties文件中文读取乱码问题(idea Java)

    1、原始代码 未加读取.properties文件的规则 debug运行截图: 2、加入.properties读取规则 debug截图: 至此 问题已解决!

    2024年02月16日
    浏览(25)
  • Java下载文件,中文文件名乱码问题解决(文件名包含很多%)

    一般情况下,大家都是这样: 其实乱码就是乱在;filename=\\\" + fileName这里,对文件名的编码设定上。 使用URLEncoder.encode(filepath,\\\"UTF-8\\\")虽然可以解决在提示下载框中正确显示汉字文件名的问题,并且在选择保存,然后打开的情况下,文件名称也可以正确的显示。 但是在提示下载框

    2024年02月12日
    浏览(30)
  • Xpdf 阅读器源码编译后查看文件中文乱码问题解决

    经查阅,是由于缺少中文字体包: 第一步: 下载所需要的字体包 下载https://dl.xpdfreader.com/xpdf-t1fonts.tar.gz 包含 下载中文字体包(非嵌入字体) http://ftp.gnu.org/gnu/non-gnu/chinese-fonts-truetype/gkai00mp.ttf.gz http://ftp.gnu.org/gnu/non-gnu/chinese-fonts-truetype/gbsn00lp.ttf.gz 完整包含中文字体文件如

    2024年02月07日
    浏览(41)
  • jmeter 5.1彻底解决中文上传乱码

    1.修改源码,然后重新打jar包,就是所有上传文件名重新获取文件名 参考链接: 多种Jmeter中文乱码问题处理方法 - 51Testing软件测试网 2.修改Advanced,必须选java

    2024年02月14日
    浏览(27)
  • 登录FTP文件夹显示乱码怎么解决

    故事背景: 因为工作需要临时 搭建了一个FTP服务器,测试过程中大部分人的电脑登陆FTP服务器都很正常,但是有部分人的电脑打开FTP文件夹就显示乱码。这个问题运维的人也是经常遇到,非常好解决 问题分析: 由于并非全部都是乱码,初步排除是服务端设置的问题,排查客

    2024年02月12日
    浏览(31)
  • Vue基于html2canvas和jspdf生成pdf文件,解决jspdf中文乱码及自动换行等问题

    在做项目时有这么一个需求,需要将当前页面指定区域的内容导出pdf到本地。借助了两个插件分别是html2canvas.js和pdf.js来实现。使用过程中遇到的问题及解决方法 解决一些问题: 导出按A4纸大小排列 预留页面边距的问题 内容过多自动分页的问题 直接使用jspdf中文乱码的问题

    2024年01月25日
    浏览(48)
  • idea 自定义配置文件,中文乱码问题

    语言:Java 项目:基于Spring框架开发的项目 工具:IntelliJ IDEA 20182021 在项目中 自定义的配置文件 (如:xx.config xx.conf xx.pro等)的中文注释,打开看到的中文注释为乱码。如图: 快速解决问题,跳过这里,直接看解决方案 1、项目编码或idea编码有问题? 2、截图中 u7f16u7801

    2024年02月15日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包