当前位置:   article > 正文

ftp服务器批量下载文件之retrieveFileStream (方式一)

retrievefilestream

1.首先先说一下这些坑:(组合套装)

标题

这个行代码一定要注意, 而且随时打印code码,以便确认错误.

2.大致思路:

3. 先根据ID查询出来url

  1. @RequestMapping(value="test1", produces = "text/plain;charset=UTF-8")
  2. public void test2(HttpServletRequest request ,HttpServletResponse response){
  3.         try {
  4.             
  5.                 List<Map<String, Object>> queryForList = jdbcTemplate.queryForList(" select url from tb_work_record where FIND_IN_SET(wr_id,'1,2')  ");
  6.                 List<String> filePaths=new ArrayList<String>();
  7.                 for (int i = 0; i < queryForList.size(); i++) {
  8.                     filePaths.add(queryForList.get(i).get("url").toString());
  9.                 }
  10.                 test2(request, response, filePaths);
  11.         } catch (Exception e) {
  12.             e.printStackTrace();
  13.         }
  14. }

4.压缩 ,调用浏览器下载,删除 web服务器临时产生zip文件

  1. public void test2(HttpServletRequest request ,HttpServletResponse response,List<String> filePaths){
  2.            //根据url获取文件流压缩到zip文件中(重点中的重点)
  3.             String  zipFilePath = copy(filePaths);
  4.             //调用浏览器下载
  5.             template(response, zipFilePath);
  6.             删除 web服务器临时产生zip文件
  7.             new File(zipFilePath);
  8.     }

5.//根据url获取文件流压缩到zip文件中

5-1.首先去ftp服务器上循环拿到文件流和文件名,

5-2.循环拿的同时循环写入到web服务器中的zip文件(可能有人要问为什么循环拿的同时要去循环写入呢? 因为每次 InputStream in = ftp.retrieveFileStream(path)  时 in都要close之后才能重新调用retrieveFileStream方法, 如果不close ,则会在第二次时in为null,或者直接假死, 但是你不能把in.close(),之后 再去调BufferedInputStream输出流写入到zip中 ,所以必须边循环拿流边循环写入到zip)

  1. public String copy(List<String> remotePath) {
  2.         Map<String, Object> map = new HashMap<>();
  3.         FTPClient ftp = new FTPClient();
  4.         String zipBasePath = "E://upload"; //web服务器地址
  5.          
  6.         String zipName =" test.zip";
  7.         String zipFilePath = zipBasePath + File.separator + zipName;//web服务器zip文件地址
  8.         try {
  9.             File zip = new File(zipFilePath);//在web服务器上创建文件
  10.             if (!zip.exists()) {
  11.                 zip.createNewFile();
  12.             }
  13.             ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zip));
  14.             // 创建FTPClient对象
  15.             String host = "172.168.31.123";
  16.             Integer port = 21;
  17.             String username = "******";
  18.             String password = "*******";
  19.             // 连接FTP服务器
  20.             // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
  21.             ftp.connect(host, port);
  22.             // 登录ftp
  23.             ftp.login(username, password);
  24.             ftp.setControlEncoding("UTF-8"); // 中文支持
  25.             ftp.enterLocalPassiveMode();//一定要加上
  26.             for (int j = 0; j < remotePath.size(); j++) {
  27.                 String path = remotePath.get(j);
  28.                 ftp.changeWorkingDirectory("/");
  29.                 String fileName = StringUtils.substringAfterLast(remotePath.get(j), "/");
  30.                 InputStream in = ftp.retrieveFileStream(path);//拿到流
  31.                 map.put("io", in);
  32.                 map.put("name", URLDecoder.decode(fileName, "UTF-8"));
  33.                 zipFileList(zipBasePath, zipName, zipFilePath, map, zos); //没关闭in之前,先写入到zip中
  34.                 in.close();
  35.                 ftp.completePendingCommand();
  36.                 System.out.println(ftp.getReplyCode());
  37.             }
  38.             zos.close();
  39.         } catch (Exception e) {
  40.             System.out.println(ftp.getReplyCode());
  41.             e.printStackTrace();
  42.         }
  43.         return zipFilePath;
  44.     }

6.将流依次写入到zip文件中

 

  1. private void zipFileList(String zipBasePath, String zipName, String zipFilePath, Map<String, Object>  filePaths,ZipOutputStream zos) throws IOException {
  2.         InputStream in=(InputStream)filePaths.get("io");
  3.         BufferedInputStream bis = new BufferedInputStream(in);  
  4.         
  5.         //将文件写入zip内,即将文件进行打包  
  6.         zos.putNextEntry(new ZipEntry(filePaths.get("name").toString()));  //这里可以修改要写入到zip中文件的名称
  7.         
  8.         //写入文件的方法,同上                  
  9.         int size = 0;  
  10.         byte[] buffer = new byte[1024];  //设置读取数据缓存大小
  11.         while ((size = bis.read(buffer)) > 0) {  
  12.             zos.write(buffer, 0, size);  
  13.         }  
  14.         //关闭输入输出流  
  15.         zos.closeEntry();  
  16.         bis.close(); 
  17.          
  18.     } 

7.调用浏览器下载

  1. public void template(HttpServletResponse response ,String downLoadPath){
  2.         try {
  3.             String fileName=downLoadPath.substring(downLoadPath.lastIndexOf("/")+1);
  4.             byte[] buffer=null;  
  5.             buffer =downFileByte(downLoadPath) ; 
  6.             String fileSuffixName=   fileName.substring(fileName.lastIndexOf(".")+1);
  7.             response.reset(); //清除缓存
  8.             response.setContentType("application/" +fileSuffixName + ";" +"charset = UTF-8"); //设置字符集和文件后缀名
  9.             String name=id.nextId()+"";
  10.             name = new String(name.getBytes(), "ISO-8859-1");
  11.             response.setHeader("Content-Disposition","attachment; filename=" +name+"."+fileSuffixName); // 设置文件名称
  12.             OutputStream toClient = new BufferedOutputStream(response.getOutputStream());  
  13.             toClient.write(buffer);  
  14.             toClient.flush();  
  15.             toClient.close();
  16.         } catch (Exception e) {
  17.             e.printStackTrace();
  18.             Log4jUtil.getLog4jUtil().error("下载zip文件异常"+e.getMessage());
  19.         }
  20.     }

8.工具类

  1. public static byte[] downFileByte(String downLoadPath) throws Exception{  
  2.         byte[] return_arraybyte=null;  
  3.         InputStream ins=new FileInputStream(downLoadPath );  
  4.         ByteArrayOutputStream byteOut = new ByteArrayOutputStream();  
  5.         byte[] buf = new byte[1024];  
  6.         int bufsize = 0;  
  7.         while ((bufsize = ins.read(buf, 0, buf.length)) != -1) {  
  8.             byteOut.write(buf, 0, bufsize);  
  9.         }  
  10.         return_arraybyte = byteOut.toByteArray();  
  11.         byteOut.close();  
  12.         ins.close();  
  13.     return return_arraybyte;  
  14.     }

 

感觉可以用到的连接:

code码:https://blog.csdn.net/jinhao2003/article/details/2141378

ftp主被动连接:https://www.cnblogs.com/huhaoshida/p/5412615.html 

in.close坑解释连接:https://www.e-learn.cn/content/java/758171

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/255579
推荐阅读
相关标签
  

闽ICP备14008679号