FTP实现文件的上传下载
首先需要先搭建FTP文件服务,分享一个网址,不多赘述。点击进入
添加maven依赖
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
FtpUtil工具类
public class FtpUtil {
/**
*
* @param ftpBean
* @param localPath 保存操本地的地址 d:/test/
* @param downloadPath 下载地址 2021/05
* @param fileName 文件全名称 123.xlsx
* @return
*/
public static boolean downloadFile(FtpBean ftpBean,String localPath,String downloadPath,String fileName){
OutputStream ios = null;
File localFile = null;
boolean result = false;
FTPClient ftpClient = new FTPClient();
try {
int reply;
ftpClient.connect(ftpBean.getAddress(), Integer.valueOf(ftpBean.getPort()));// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftpClient.login(ftpBean.getUsername(), ftpBean.getPassword());// 登录
reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
return result;
}
//切换下载目录 2021/05/
ftpClient.changeWorkingDirectory(downloadPath);
FTPFile[] ftpFiles = ftpClient.listFiles(fileName);//全名 123.xlsx/123.csv
if(ftpFiles.length>0){
localFile = new File(localPath+ftpFiles[0].getName());
//先判断文件是否存在 如果存在就不重复下载
if(!localFile.exists()){
ios = new FileOutputStream(localFile);
result = ftpClient.retrieveFile(ftpFiles[0].getName(),ios);
ios.close();
}
}
ftpClient.logout();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(ios != null){
ios.close();
}
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException ioe) {
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
public static boolean uploadFile(FtpBean ftpBean) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(ftpBean.getAddress(), Integer.valueOf(ftpBean.getPort()));// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftp.login(ftpBean.getUsername(), ftpBean.getPassword());// 登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
String tempPath = ftpBean.getBasepath();
String fileName = ftpBean.getFileName();
if (!ftp.changeWorkingDirectory(ftpBean.getBasepath())) {
//判断目录是否存在,如果目录不存在创建目录,目录存在则跳转到此目录下
String []tempPathList = tempPath.split("/");
for (String dir : tempPathList) {
if(dir != null && dir != ""){
if (!ftp.changeWorkingDirectory(dir)) {
if (!ftp.makeDirectory(dir)) {
return result;
} else {
ftp.changeWorkingDirectory(dir);
}
}
}
}
}
//保存文件方式 SaveFileType:1-覆盖;2-文件名称后面+(递增数据)
if(ftpBean.getSaveFileType() == 2){
FTPFile[]file = ftp.listFiles();
Integer i = 1;
//采用递归,文件名重复自动加(i)
fileName = reName(file, i, fileName, fileName);
}
//设置上传文件的类型为二进制类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//设置模式很重要
ftp.enterLocalActiveMode();
//上传文件
result = ftp.storeFile(fileName, ftpBean.getInputStream());
if(!result){
return result;
}
ftpBean.getInputStream().close();
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
//递归重命名去重复,文件名重复自动加(i)
public static String reName(FTPFile[] file, int i, String fileName, String nameFlag){
boolean isOk = true;
for (FTPFile file2 : file) {
String flag = file2.getName();
if(nameFlag.equals(flag)){
String []fileNames = fileName.split("\\.");
if(fileNames.length > 0){
nameFlag = "";
}
for (int j = 0; j < fileNames.length; j++) {
if(j == fileNames.length-1){
nameFlag = nameFlag+"("+i+")."+fileNames[j];
}else if(j == fileNames.length-2){
nameFlag = nameFlag + fileNames[j];
}else{
nameFlag = nameFlag + fileNames[j] + ".";
}
}
i += 1;
isOk = false;
}else{
isOk = true;
}
}
if(isOk == false){
nameFlag = reName(file, i, fileName, nameFlag);
}
return nameFlag;
}
//文件保存路径(根据" 年/月"保存文件)
public static String basePath(){
String resDir = "/";
Calendar date = Calendar.getInstance();
String year = String.valueOf(date.get(Calendar.YEAR));
String month = String.valueOf(date.get(Calendar.MONTH)+ 1);
if (month.length()==1){
month="0"+month;
}
return year+resDir+month;
}
}
ftp 连接配置
public class Constant{
//ftp 连接配置
public class FTP{
/** IP地址 */
public static final String ADDRESS = "127.0.0.1";
/** 端口号 */
public static final String PORT = "21";
/** 用户名 */
public static final String USERNAME = "admin";
/** 密码 */
public static final String PASSWORD = "123456";
}
}
测试
//上传
public String uploadFile(MultipartFile uplodfile) {
String result = "";
FtpBean ftpBean = new FtpBean();
try
{
///设置FTP上传的基本信息
ftpBean.setAddress(Constant.FTP.ADDRESS);
ftpBean.setPort(Constant.FTP.PORT);
ftpBean.setUsername(Constant.FTP.USERNAME);
ftpBean.setPassword(Constant.FTP.PASSWORD);
ftpBean.setSaveFileType(2);
//设置文件流
ftpBean.setInputStream(uplodfile.getInputStream());
//文件后缀
String fileNameOrig=uplodfile.getOriginalFilename();//原文件名
String []fileNames = fileNameOrig.split("\\.");;
String suffix=fileNames[fileNames.length-1];
//设置文件路径
ftpBean.setBasepath(FtpUtil.basePath());
//设置文件名
SimpleDateFormat sdfms = new SimpleDateFormat("yyMMdd_HHmmssSSS");
String date = sdfms.format(DateUtils.GetDateTimeNow());
//添加两位自动生成的数字,防止重复
int i=(int)(Math.random()*98)+1;
String fileName = date +"_"+ i +"."+suffix;
ftpBean.setFileName(fileName);
//上传文件
boolean isOK = FtpUtil.uploadFile(ftpBean);
if (isOK)
{
result = "文件上传成功";
}else{
result = "文件上传失败";
}
return result;
} catch (Exception e){
result = "文件上传失败";
}finally {
return result;
}
}
//下载
public Boolean download() throws IOException {
Boolean result =false;
FtpBean ftpBean = new FtpBean();
///设置FTP上传的基本信息
ftpBean.setAddress(Constant.FTP.ADDRESS);
ftpBean.setPort(Constant.FTP.PORT);
ftpBean.setUsername(Constant.FTP.USERNAME);
ftpBean.setPassword(Constant.FTP.PASSWORD);
Boolean bo = FtpUtil.downloadFile(ftpBean,"F:/testFile/","2021/05","123.xlsx");
if(!bo){
//下载失败
}
return result;
}
@Date
public class FtpBean {
//获取ip地址
private String address;
//端口号
private String port;
//用户名
private String username;
//密码
private String password;
//文件名称
private String fileName;
//基本路
private String basepath;
//文件输入流
private InputStream inputStream;
//保存文件方式 默认:1-覆盖;2-文件名称后面+(递增数据)
private Integer saveFileType;
}