Spring Boot 读取 FTP文件
Spring Boot读取 FTP文件
开发环境:
- java 8
- spring boot 2.x
- 前后端分离
需求:从FTP文件服务器里获取PDF文件
废话不多说,直接开干
1、引用依赖
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
2、配置properties文件
#地址
ftp.host = 127.0.0.1
#用户名
ftp.username = admin
#密码
ftp.password = admin
#端口,0表示不使用端口
ftp.port = 0
3、创建配置类
@Slf4j
@Component
public class FTPUtils {
@Value("${ftp.host}")
private String host;
@Value("${ftp.username}")
private String username;
@Value("${ftp.password}")
private String password;
@Value("${ftp.port}")
private int port;
private final static String ERROR_NO_FILE = "文件不存在!";
private final static String ERROR_FILE = "FTP文件下载失败!";
private final static String ERROR_CONN = "连接FTP失败!";
/**
* 示例
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// FTPUtils ftpUtils = new FTPUtils();
// FTPClient ftpClient = ftpUtils.connectFtp();
// if (!existFile(ftpClient,path)) {
// System.out.println("文件不存在");
// return;
// }
// FTPFile ftpFile = ftpClient.mdtmFile(path);
// System.out.println(ftpFile.getName());
}
/**
* 读取ftp文件流
*
* @param filePath ftp文件路径
* @throws Exception
*/
public void readFile(String filePath, HttpServletResponse resp) {
OutputStream out = null;
FTPClient ftpClient = this.connectFtp();
try {
out = resp.getOutputStream();
Assert.isTrue(existFile(ftpClient, filePath), ERROR_NO_FILE);
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
// commons-net提供的下载Ftp文件并写入输出流的方法。
ftpClient.retrieveFile(filePath, out);
ftpClient.logout();
} catch (Exception e) {
log.error("FTP文件下载失败!" + e.toString());
Assert.isTrue(false, ERROR_FILE + e.getMessage());
} finally {
this.closeFtpClient(ftpClient);
}
}
/**
* 读取ftp文件流,返回字节流
*
* @param filePath ftp文件路径
* @throws Exception
*/
public InputStream readFileIs(String filePath) {
InputStream is = null;
FTPClient ftpClient = this.connectFtp();
try {
Assert.isTrue(existFile(ftpClient, filePath), ERROR_NO_FILE);
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
// commons-net提供的下载Ftp文件并写入输出流的方法。
is = ftpClient.retrieveFileStream(filePath);
ftpClient.logout();
} catch (Exception e) {
log.error("FTP文件下载失败!" + e.toString());
Assert.isTrue(false, ERROR_FILE + e.getMessage());
} finally {
this.closeFtpClient(ftpClient);
}
return is;
}
/**
* 获取FTP某一特定目录下的所有文件名称
*
* @param ftpClient 已经登陆成功的FTPClient
* @param ftpDirPath FTP上的目标文件路径
*/
public List<String> getFileNameList(FTPClient ftpClient, String ftpDirPath) {
List<String> list = new ArrayList();
try {
// 通过提供的文件路径获取FTPFile对象列表
FTPFile[] files = ftpClient.listFiles(ftpDirPath);
// 遍历文件列表,打印出文件名称
for (int i = 0; i < files.length; i++) {
FTPFile ftpFile = files[i];
// 此处只打印文件,未遍历子目录(如果需要遍历,加上递归逻辑即可)
if (ftpFile.isFile()) {
list.add(ftpFile.getName());
}
}
} catch (IOException e) {
log.error("错误" + e);
}
return list;
}
/**
* 登陆FTP并获取FTPClient对象
*
* @return
*/
public FTPClient connectFtp() {
FTPClient ftpClient = null;
String errorMsg = null;
try {
ftpClient = new FTPClient();
//设置连接超时时间
ftpClient.setConnectTimeout(1000 * 30);
// 连接FTP服务器
if (port == 0) {
ftpClient.connect(host);
} else {
ftpClient.connect(host, port);
}
// 登陆FTP服务器
ftpClient.login(username, password);
// 中文支持
ftpClient.setControlEncoding("UTF-8");
// 设置文件类型为二进制(如果从FTP下载或上传的文件是压缩文件的时候,不进行该设置可能会导致获取的压缩文件解压失败)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
ftpClient.disconnect();
Assert.isTrue(false, ERROR_CONN + "用户名或密码错误");
} else {
log.info("FTP连接成功!");
}
} catch (Exception e) {
log.info("登陆FTP失败,请检查FTP相关配置信息是否正确!" + e);
Assert.isTrue(false, ERROR_CONN + e.getMessage());
return null;
}
return ftpClient;
}
/**
* 关闭FTP连接
*
* @param ftpClient
*/
public void closeFtpClient(FTPClient ftpClient) {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
}
/**
* 判断ftp服务器文件是否存在
*
* @param ftpClient
* @param path
* @return
* @throws IOException
*/
private static boolean existFile(FTPClient ftpClient, String path) throws IOException {
boolean flag = false;
FTPFile[] ftpFileArr = ftpClient.listFiles(path);
if (ftpFileArr.length > 0) {
flag = true;
}
return flag;
}
}
4、控制层处理
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private FTPUtils ftpUtils;
/**
* 读取ftp上的pdf文件
*/
@GetMapping("/readPdfFile")
public void readPdfFile(HttpServletResponse resp, String path) throws Exception {
valid(path);
//直接返回pdf
ftpUtils.readFile(path,resp);
String filename = path.substring(path.lastIndexOf("/")+1);
resp.setContentType("application/pdf;charset=UTF-8");
resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "utf-8"));
}
}
5、通过PostMan测试
ok
本文作者:黎华扬
本文链接:https://www.cnblogs.com/galenblog/p/16304709.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
spring boot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步