java使用org.apache.commons.net.FTPClient进行FTP上传下载操作(SpringBoot版)以及文件名中文乱码处理

本文介绍了如何在Spring Boot中使用`org.apache.commons.net.FTPClient`进行FTP文件的上传和下载,特别强调了在处理中文文件名乱码问题上的解决方案。通过配置FTP连接参数、创建FTPProperties以及编写上传下载工具类,实现了FTP操作并解决了编码不一致导致的乱码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里我先提下FTP文件名乱码这个问题吧
(1)首先FTP是一种传输协议,它本身并不是一个服务器,只是我们通常称那些可以支持FTP协议的服务端 称之为 FTP服务器

(2)FTP协议中,默认文件名编码为ISO-8859-1,这就是如果我们上次文件时,文件名含中文,如果不做编码转换处理,就会导致文件名乱码的原因

关于乱码简述: 乱码的原因,归根结底就是 编码和解码方式不一致所导致的。

下面进入Spring使用FTP正题:

1. 首先在application.yml中配置FTP的连接参数

#ftp连接配置
ftp:
  address: 127.0.0.1
  port: 21
  username: test
  password: test

2. 新建FTPProperties配置类

@Data
@Component
@ConfigurationProperties(prefix = "ftp")
public class FTPProperties {
   
    private String address;
    private Integer port;
    private String username;
    private String password;
}

3. 配置信息完成,接下来写FTP上传下载的工具类

package ftp;

import com.landa.exception.CustomException;
import ftp.config.FTPProperties;
import io.util.FileUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.commons.net.ftp.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.file.NoSuchFileException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Author: pengfei.yang
 * @Date: 2020/5/21 9:52
 * @Version: 1.0
 **/
@Slf4j
@Component
public class FTPUtil {
   

    @Autowired
    private FTPProperties config;
	
	//本地字符编码
    private static String LOCAL_CHARSET="GBK";
    //FTP默认文件名编码
    private static String SERVER_CHARSET=FTPClient.DEFAULT_CONTROL_ENCODING;
	
	//服务端UTF8的支持选项
    private static String COMMAND_OPEN_UTF8="OPTS UTF8";
    //开启状态
    private static String OPEN_STATUS="ON";
    //路径分隔符
    private static final String SPECTOR="/";
    //中文字符匹配正则
    private static Pattern P = Pattern.compile("[\u4e00-\u9fa5]");


    /**
     * @Author: pengfei.yang
     * @Description: 与FTP服务器建立连接
     * @Date: 2020/5/21 10:16
     * @return: org.apache.commons.net.ftp.FTPClient
     **/
    public FTPClient getFtpConnection()throws Exception{
   
        FTPClient ftpClient = new FTPClient();
        /*FTPClientConfig clientConfig=new FTPClientConfig();
        clientConfig.setDefaultDateFormatStr("yyyy-MM-dd HH:mm:ss");*/
        /*
            保存要由FTP控件连接使用的字符编码。某些FTP服务器要求以非ASCII编码(如UTF-8)发布命令,以便可以指定具有多字节字符表示形式(例如Big 8)的文件名。
            请注意,必须在建立连接之前进行设置。一般情况下默认不设置该项
            ftpClient.setControlEncoding("UTF-8");
            FTP默认_controlEncoding为'ISO-8859-1',若已明确FTP服务器支持UTF-8且该项设置了UTF-8
            则SERVER_CHARSET需由'ISO-8859-1'改为"UTF-8"否则连接之后的后续操作如果包含中文则会导致文件名乱码;
        */
        ftpClient.connect(config.getAddress(), config.getPort
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值