java实现文件打包下载

业务场景:

          从A服务器通过SFTP将文件下载到应用服务器B,需要将文件从应用服务器B下载到用户本地(文件和应用都在B服务器)

想法:

          1. 想要通过FTP连接B服务器下载,但是FTP只能下载到应用所在的本地,也就是只能下载到下载到B服务器,无法下载到用户本地。

          2. 通过普通的下载方式,用文件流通过response下载,但是文件夹内有多个文件,无法同时下载

实现:

          采用将多个文件打包下载

          

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    	
        //通过工号和日期去获取相应的文件夹路径
    	String usercode = request.getParameter("usercode");
    	String date = request.getParameter("date");
        
    	String formPath = "/tmp/ENongXian/"+usercode+"/"+date;
        //遍历这个路径下的所有文件名
    	List fileNames = this.getFileName(formPath);
        //如果找不到文件  返回not found file
    	if(fileNames == null||fileNames.size()==0){
    		PrintWriter out = response.getWriter();
    		response.setContentType("text/html; charset=GBK");//注意text/html,和application/html
    		out.print("<html><body><script type='text/javascript'>alert('not found file');</script></body></html>");
    		out.flush();
    		out.close();
    	}else{
            //开始批量压缩下载
    		ZipOutputStream zos = new ZipOutputStream(response.getOutputStream()); 
        	response.setContentType("APPLICATION/OCTET-STREAM");  
        	response.setHeader("Content-Disposition","attachment; filename="+this.getZipFilename());  
        	System.out.println("in BatchDownload................"); 
    		File[] files = new File[fileNames.size()];  
        	for(int i=0;i<files.length;i++){
        		String filename = fileNames.get(i).toString();
        		files[i] = new File(formPath+"/"+filename);
        	}
            将文件进行压缩
        	zipFile(files, "", zos);     
        	zos.flush();     
        	zos.close();   
    	}
    	  
    }
    
    private void zipFile(File[] subs, String baseName, ZipOutputStream zos) throws IOException {       
        for (int i=0;i<subs.length;i++) {  
         File f=subs[i];  
         zos.putNextEntry(new ZipEntry(baseName + f.getName()));     
         FileInputStream fis = new FileInputStream(f);     
         byte[] buffer = new byte[1024];     
         int r = 0;     
         while ((r = fis.read(buffer)) != -1) {     
             zos.write(buffer, 0, r);     
         }     
         fis.close();   
        }  
   }  
   private String getZipFilename(){  
    Date date=new Date();  
    String s=date.getTime()+".zip";  
    return s;  
   }  
   
	public List getFileName(String filePath){
		File file = new File(filePath);
		List fileNameList = new ArrayList();
		File[] fileList = file.listFiles();
		if(fileList == null || fileList.length ==0){
			return null;
		}
		for(int i=0;i<fileList.length;i++){
			if("txt".equals(fileList[i].getName().substring(fileList[i].getName().lastIndexOf(".") + 1))){
				continue;
			}
			if(fileList[i].isFile()){
				String fileName = fileList[i].getName();
				fileNameList.add(fileName);
			}			
		}
		return fileNameList;
	}

猜你喜欢

转载自blog.csdn.net/CodeFarmer_/article/details/82216022
今日推荐