这里我先提下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