FTP文件上传下载

FTP文件上传下载小demo
前端页面(layui.js)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>layui</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport"
	content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="css/layui.css" media="all">
<!-- 注意:如果你直接复制所有代码到本地,上述css路径需要改成你本地的 -->
</head>
<body>
          
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
  <legend>高级应用:制作一个多文件列表</legend>
</fieldset> 
 
<div class="layui-upload">
  <button type="button" class="layui-btn layui-btn-normal" id="testList">选择多文件</button> 
  <div class="layui-upload-list">
    <table class="layui-table">
      <thead>
        <tr><th>文件名</th>
        <th>大小</th>
        <th>状态</th>
        <th>操作</th>
      </tr></thead>
      <tbody id="demoList"></tbody>
    </table>
  </div>
  <button type="button" class="layui-btn" id="testListAction">开始上传</button>
</div> 
  

          
<script src="layui.js" charset="utf-8"></script>
<!-- 注意:如果你直接复制所有代码到本地,上述js路径需要改成你本地的 -->
<script>layui.use('upload', function() {
	var $ = layui.jquery,
		upload = layui.upload;

	//多文件列表示例
	var demoListView = $('#demoList'),
		uploadListIns = upload.render({
			elem: '#testList',
			url: '/file/upload',
			accept: 'file',
			multiple: true,
			auto: false,
			bindAction: '#testListAction',
			choose: function(obj) {
				var files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列
				//读取本地文件
				obj.preview(function(index, file, result) {
					var tr = $(['<tr id="upload-' + index + '">', '<td>' + file.name + '</td>', '<td>' + 
					(file.size / 1014).toFixed(1) + 'kb</td>', '<td>等待上传</td>', '<td>', '<button class
					="layui-btn layui-btn-xs demo-reload layui-hide">重传</button>', 
					'<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">删除</button>',
					</td>', '</tr>'].join(''));

					//单个重传
					tr.find('.demo-reload').on('click', function() {
						obj.upload(index, file);
					});

					//删除
					tr.find('.demo-delete').on('click', function() {
						delete files[index]; //删除对应的文件
						tr.remove();
						uploadListIns.config.elem.next()[0].value = ''; 
						//清空 input file 值,以免删除后出现同名文件不可选
					});

					demoListView.append(tr);
				});
			},
			done: function(res, index, upload) {
				if(res.code == '0') { //上传成功
					var tr = demoListView.find('tr#upload-' + index),
						tds = tr.children();
					tds.eq(2).html('<span style="color: #5FB878;">上传成功</span>');
					tds.eq(3).html(''); //清空操作
					return delete this.files[index]; //删除文件队列已经上传成功的文件
				}
				this.error(index, upload);
			},
			error: function(index, upload) {
				var tr = demoListView.find('tr#upload-' + index),
					tds = tr.children();
				tds.eq(2).html('<span style="color: #FF5722;">上传失败</span>');
				tds.eq(3).find('.demo-reload').removeClass('layui-hide'); //显示重传
			}
		});

});</script>

</body>
</html>

在这里插入图片描述

FTP工具类
import java.io.Closeable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FTPUtils implements Closeable{
	
	private static final Logger logger=LoggerFactory.getLogger(FTPUtils.class);
    private FTPClient ftp=null;
    boolean _isLogin=false;
	
    /**
     * 下载文件
     * @param ftpDirName
     * @param ftpFileName
     * @param localFileName
     * @return
     */
    public boolean downloadFile(String ftpDirName,String ftpFileName,String localFileName){
    	try{
    		if("".equals(ftpDirName))
    		    ftpDirName="/";
    		String dir=new String(ftpDirName.getBytes("UTF-8"),"iso-8859-1");
    		if(!ftp.changeWorkingDirectory(dir))
    		{
    			logger.info("切换目录失败{}",dir);
    			return false;
    		}
    		FTPFile[] files=ftp.listFiles();
    		String fileName=new String(ftpFileName.getBytes("UTF-8"),"iso-8859-1");
            Long t=0L;
            int index=-1;  //确定要下载的最新时间为准
    		for(int i=0;i<files.length;i++){
    			//获取时间
    			if(files[i].getName().indexOf("_saveTime_")<0) 
    				continue;
    			String name=files[i].getName().substring(0,files[i].getName().indexOf("_saveTime_"))+files[i].getName().substring(files[i].getName().lastIndexOf("."));
    			logger.info("fileName========================={}",name);
    			if(!ftpFileName.equals(name))
    				continue;
    			String time=files[i].getName().substring(files[i].getName().indexOf("_saveTime_"),files[i].getName().lastIndexOf("."));
    			logger.info("time======================{}",time);
    			time=time.substring(10);
    			Long timeMil=new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").parse(time).getTime();
    			if(timeMil>t){
    				t=timeMil;
    				index=i;
    			}
    		}
    		if(index==-1){
    			logger.info("文件不存在{}",fileName);
    			return false;
    		}
    		FileOutputStream fos=new FileOutputStream(new File(localFileName));
    		/**
    		 * OutputStream osm=resp.getOutputStream
    		 */
    		
    		ftp.retrieveFile(files[index].getName(), fos);
    		logger.info("文件{}已从ftp下载",fileName);
    		fos.close();
    		logger.info("输出流关闭成功");
    		this.close();
    		logger.info("ftp断开连接成功");
    		return true;
    	}catch(Exception e){
    		logger.info("下载失败{}",e);
    		return false;
    	}
    }
    
    
    /**
     * 创建目录
     * @param ftpDirName
     * @return
     */
    public boolean createDir(String ftpDirName){
		String dir = null;
		try {
			// 目录编码,解决中文路径问题
			dir = new String(ftpDirName.toString().getBytes("UTF-8"), "iso-8859-1");
			// 尝试切入目录
			if (ftp.changeWorkingDirectory(dir))
				return true;
			ftpDirName = ftpDirName.replaceAll("^(" + "/" + ")+", ""); // 删除开始的/
			ftpDirName = ftpDirName.replaceAll("(" + "/" + ")+$", ""); // 删除尾部的/
			String[] strArr = ftpDirName.split("/");
			StringBuffer stringBuffer = new StringBuffer();
			// 循环生成子目录
			for (String str : strArr) {
				stringBuffer.append("/");
				stringBuffer.append(str);
				// 目录编码
				dir = new String(stringBuffer.toString().getBytes("UTF-8"), "iso-8859-1");
				// 尝试切入目录
				if (ftp.changeWorkingDirectory(dir))
					continue;
				if (!ftp.makeDirectory(dir)) {
					logger.info("ftp创建目录失败:{}", stringBuffer.toString());
					return false;
				}
				logger.info("创建ftp目录成功:{}", stringBuffer.toString());
			}
			// 将目录切换到指定路径
			return ftp.changeWorkingDirectory(dir);

		} catch (Exception e) {
			logger.info("创建ftp目录失败");
			return false;
		}
    }
    
    /**
     * ftp上传文件
     * @param inputStream
     * @param ftpDirName  文件目录
     * @param fileName  文件名
     * @return true||false
     */
    public boolean uploadFile(InputStream inputStream,String ftpDirName,String fileName){
    	logger.info("准备上传【流】到ftp:{}/{}",ftpDirName,fileName);
    	if(fileName==null || fileName.trim().isEmpty()){
    		throw new RuntimeException("上传文件必须填写文件名!");
    	}
    	try{
    		//设置上传目录(没有则创建)
    		if(!createDir(ftpDirName)){
    			throw new RuntimeException("切入FTP目录失败:"+ftpDirName);
    		}
    		ftp.setBufferSize(1024);
    		ftp.setControlEncoding("UTF-8");
    		FTPClientConfig conf=new FTPClientConfig(FTPClientConfig.SYST_NT);
    		conf.setServerLanguageCode("zh");
    		ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
    		
    		String ftpFileName=new String(fileName.getBytes("UTF-8"),"iso-8859-1");
    		if(ftp.storeFile(ftpFileName, inputStream)){
    			inputStream.close();
    			logger.info("文件上传成功:{}/{}",ftpDirName,fileName);
    			this.close();
    			logger.info("ftp服务器断开连接成功");
    			return true;
    		}
    		return false;
    	}catch(Exception e){
    		logger.info("文件上传失败{}",e);
    		return false;
    	}
    }
    
    
    /**
     * ftp登录
     * @param ip ftp服务地址
     * @param port  端口号
     * @param username  用户名
     * @param password  密码
     * @return
     */
    public boolean login(String ip,int port,String username,String password){   	
		ftp = new FTPClient();
		try {
			ftp.connect(ip, port);
			_isLogin = ftp.login(username, password);
			logger.info(_isLogin == true ? username + "ftp登录成功" : 
			username + "ftp登录失败");
			// 检测连接是否成功
			int reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				logger.info("FTP服务器拒接连接!");
				return false;
			}
			return true;
		} catch (Exception e) {
			logger.info("FTP服务器登录异常");
			return false;
		}
    }
    
    
    
    @Override
	public void close() throws IOException {
	   this.closeFtpConnection();
	}
	
	/**
	 * 销毁ftp连接
	 */
	private void closeFtpConnection(){
		_isLogin = false;
		if (ftp != null) {
			if (ftp.isConnected()) {
				try {
					ftp.logout();
					ftp.disconnect();
				} catch (IOException e) {
					logger.info("文件服务器退出异常:{}", e);
				}
			}
		}
	}
}
上传下载
@PostMapping("/upload")
	public Map<String,Object> upload(MultipartFile file) throws IllegalStateException, IOException {
		 Map<String,Object>  retMap=new HashMap<String,Object> (); 
		 if(file!=null){
			 String fileName=file.getOriginalFilename();
			 logger.info("文件原名称OriginalFileName={}",fileName);
			 logger.info("文件大小Size={}byte or {}KB",file.getSize(),file.getSize()/1024);
			 FTPUtils ftp=new FTPUtils();
			 boolean login=ftp.login("106.13.26.xxx",21, "aProduct", "xxx");
			 if(login==false){
				 logger.info("code", "FTP服务登录异常");
				 retMap.put("code", "FTP服务登录异常");
				 return retMap;
			 }
			
			 String dateStr="_saveTime_"+new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").format(new Date());
			 String beginStr=fileName.substring(0,fileName.lastIndexOf("."));
			 String endStr=fileName.substring(fileName.lastIndexOf("."));			 
			 fileName=beginStr+dateStr+endStr;
			 
			 ftp.uploadFile(file.getInputStream(),"/aProduct",fileName);
			 logger.info("文件上传成功");
			 retMap.put("code", "0");
			 return retMap;
			 
		 }else{
			 retMap.put("code", "未获取上传文件!");
			 logger.info("未获取上传文件!");
			 return retMap;
		 }
	}
	
	@GetMapping("/download")
	public Map<String,Object> download(@RequestParam(value="file") String file) throws IllegalStateException, IOException {
		Map<String, Object> retMap = new HashMap<String, Object>();
		if (file != null) {
			FTPUtils ftp = new FTPUtils();
			boolean login = ftp.login("106.13.26.188", 21, "aProduct", "qq951210");
			if (login == false) {
				logger.info("code", "FTP服务登录异常");
				retMap.put("code", "FTP服务登录异常");
				return retMap;
			}
			logger.info("fileName===================={}",file);
			boolean result = ftp.downloadFile("/aProduct", file, "C:\\Users\\wanlf\\Desktop\\1\\com\\"+file);
			if (result == false) {
				logger.info("文件下载失败");
				retMap.put("code", "1");
				return retMap;
			} else {
				logger.info("文件下载成功");
				retMap.put("code", "文件下载成功");
				return retMap;
			}
		} else {
			retMap.put("code", "2");
			logger.info("文件名为空");
			return retMap;
		}
	}

在这里插入图片描述

下载
http://localhost:8090/file/download?file=mybatis.xml 上传要下载的文件名即可
以上一个上传下载小例子、可根据需要自行调整代码
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值