java ftp上传下载文件最全工具类
配置文件
ftp:
host: 127.0.0.1
port: 21
user: user
pwd: pwd
bankPath: /home/
platform: /home/
先附上完整工具类代码
package cn.chinaunicom.mall.bhrb.utils;
/**
* @author yinna
* @version 1.0
* @date 2021/3/26 16:25
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
public class FtpUtil {
/**
* 上传文件(可供Action/Controller层使用)
*
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器保存目录
* @param fileName 上传到FTP服务器后的文件名称
* @param inputStream 输入文件流
* @return
*/
public static boolean uploadFile(String hostname, int port, String username, String password, String pathname, String fileName, InputStream inputStream) {
boolean flag = false;
FTPClient ftpClient = new FTPClient();
ftpClient.setControlEncoding("UTF-8");
try {
//连接FTP服务器
ftpClient.connect(hostname, port);
//登录FTP服务器
ftpClient.login(username, password);
//是否成功登录FTP服务器
int replyCode = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(replyCode)) {
return false;
}
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.makeDirectory(pathname);
ftpClient.changeWorkingDirectory(pathname);
ftpClient.storeFile(fileName, inputStream);
inputStream.close();
ftpClient.logout();
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}
/**
* 删除文件
*
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器保存目录
* @param filename 要删除的文件名称
* @return
*/
public static boolean deleteFile(String hostname, int port, String username, String password, String pathname, String filename) {
boolean flag = false;
FTPClient ftpClient = new FTPClient();
try {
//连接FTP服务器
ftpClient.connect(hostname, port);
//登录FTP服务器
ftpClient.login(username, password);
//验证FTP服务器是否登录成功
int replyCode = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(replyCode)) {
return false;
}
//切换FTP目录
ftpClient.changeWorkingDirectory(pathname);
ftpClient.dele(filename);
ftpClient.logout();
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.logout();
} catch (IOException e) {
}
}
}
return flag;
}
/**
* 下载文件
*
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器文件目录
* @param filename 文件名称
* @param localpath 下载后的文件路径
* @return
*/
public static boolean downloadFile(String hostname, int port, String username, String password, String pathname, String filename, String localpath) {
boolean flag = false;
FTPClient ftpClient = new FTPClient();
try {
//连接FTP服务器
ftpClient.connect(hostname, port);
//登录FTP服务器
ftpClient.login(username, password);
//验证FTP服务器是否登录成功
int replyCode = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(replyCode)) {
return false;
}
//切换FTP目录
ftpClient.changeWorkingDirectory(pathname);
FTPFile[] ftpFiles = ftpClient.listFiles();
for (FTPFile file : ftpFiles) {
if (filename.equalsIgnoreCase(file.getName())) {
File localFile = new File(localpath + "/" + file.getName());
OutputStream os = new FileOutputStream(localFile);
ftpClient.retrieveFile(file.getName(), os);
os.close();
}
}
ftpClient.logout();
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.logout();
} catch (IOException e) {
}
}
}
return flag;
}
}
当把文件直接返回给前端时
/**
* 根据文件路径进行下载操作
*
* @param filePath 文 件路径
* @return 无返回值
* @throws Exception
*/
@GetMapping("/downloadFile")
@ApiOperation("根据文件路径进行下载操作")
@ApiImplicitParams({
@ApiImplicitParam(value = "文件路径", name = "filePath", required = true, paramType = "query", dataType = "String"),
})
public void downloadFile(String filePath, HttpServletResponse response) throws Exception {
// 清空response
response.reset();
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
if (StringUtils.isBlank(filePath)) {
throw new ServiceErrorException("文件路径有误");
}
String[] split = filePath.split("/");
String fileName = split[split.length - 1];
FTPClient ftpClient = new FTPClient();
try {
//连接FTP服务器
ftpClient.connect(host, port);
//登录FTP服务器
ftpClient.login(user, pwd);
//验证FTP服务器是否登录成功
int replyCode = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(replyCode)) {
throw new Exception();
}
//切换FTP目录
ftpClient.changeWorkingDirectory(bankPath);
FTPFile[] ftpFiles = ftpClient.listFiles();
if (ftpFiles.length < 1) {
throw new ServiceErrorException("文件路径有误");
}
if (fileName.equalsIgnoreCase(ftpFiles[0].getName())) {
ftpClient.retrieveFile(ftpFiles[0].getName(), toClient);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ftpClient.isConnected()) {
ftpClient.logout();
}
}
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes()));
// response.addHeader("Content-Length", "" + file.length());
response.setContentType("application/octet-stream");
}