FTP实现文件的上传下载

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值