zoukankan      html  css  js  c++  java
  • SpringMVC实现文件下载的两种方式及多文件下载

    1.传统方法

        @RequestMapping("/download")
    		public String download( String fileName ,String filePath, HttpServletRequest request, HttpServletResponse response){
    					 
    			response.setContentType("text/html;charset=utf-8");
    			try {
    				request.setCharacterEncoding("UTF-8");
    			} catch (UnsupportedEncodingException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    					
    			java.io.BufferedInputStream bis = null;
    			java.io.BufferedOutputStream bos = null;
    		
    			String downLoadPath = filePath;  //注意不同系统的分隔符
    		//	String downLoadPath =filePath.replaceAll("/", "\\\\");   //replace replaceAll区别 *****  
    			System.out.println(downLoadPath);
    			
    			try {
    				long fileLength = new File(downLoadPath).length();
    				response.setContentType("application/x-msdownload;");
    				response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("utf-8"), "ISO8859-1"));
    				response.setHeader("Content-Length", String.valueOf(fileLength));
    				bis = new BufferedInputStream(new FileInputStream(downLoadPath));
    				bos = new BufferedOutputStream(response.getOutputStream());
    				byte[] buff = new byte[2048];
    				int bytesRead;
    				while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
    					bos.write(buff, 0, bytesRead);
    				}
    			} catch (Exception e) {
    				e.printStackTrace();
    			} finally {
    				if (bis != null)
    					try {
    						bis.close();
    					} catch (IOException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				if (bos != null)
    					try {
    						bos.close();
    					} catch (IOException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    			}
    			return null;	
    		}
    

    2.利用springmvc提供的ResponseEntity类型,使用它可以很方便地定义返回的HttpHeaders和HttpStatus。

            @RequestMapping("/download")  
    	    public ResponseEntity<byte[]> export(String fileName,String filePath) throws IOException {  
    	    	
    	        HttpHeaders headers = new HttpHeaders();    
    	        File file = new File(filePath);
    	        
    	        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);    
    	        headers.setContentDispositionFormData("attachment", fileName);    
    	       
    	        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),    
    	                                              headers, HttpStatus.CREATED);    
    	    } 

     3、多文件下载[2]

    主要先下载到本地,并添加到压缩文件中,再读取压缩文件到数组中,而后将数组返回前台返回前台

    //批量文件压缩后下载
    	@RequestMapping("/downLoad2")
    	public ResponseEntity<byte[]> download2(HttpServletRequest request) throws IOException {
    		
    		//需要压缩的文件
    		List<String> list = new ArrayList<String>();
    		list.add("test.txt");
    		list.add("test2.txt");
    		
    		//压缩后的文件
    		String resourcesName = "test.zip";
    		
    		ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream("D:/"+resourcesName));
    		InputStream input = null;
    		
    		for (String str : list) {
    			String name = "D:/"+str;
    			input = new FileInputStream(new File(name));  
                zipOut.putNextEntry(new ZipEntry(str));  
                int temp = 0;  
                while((temp = input.read()) != -1){  
                    zipOut.write(temp);  
                }  
                input.close();
    		}
    		zipOut.close();
    		File file = new File("D:/"+resourcesName);
    		HttpHeaders headers = new HttpHeaders();
    		String filename = new String(resourcesName.getBytes("utf-8"),"iso-8859-1");
    		headers.setContentDispositionFormData("attachment", filename);
    		headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    		return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATED);
    	}
    

    另外需要注意的一点

    ajax请求无法响应下载功能因为response原因,一般请求浏览器是会处理服务器输出的response,例如生成png、文件下载等,然而ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。文件的下载是以二进制形式进行的,虽然可以读取到返回的response,但只是读取而已,是无法执行的,说白点就是js无法调用到浏览器的下载处理机制和程序。

    推荐使用这种方式 自己构建表单进行提交

    var form = $("<form>");
    form.attr("style","display:none");
    form.attr("target","");
    form.attr("method","post");
    form.attr("action",rootPath + "T_academic_essay/DownloadZipFile.do");
    var input1 = $("<input>");
    input1.attr("type","hidden");
    input1.attr("name","strZipPath");
    input1.attr("value",strZipPath);
    $("body").append(form);
    form.append(input1);
    form.submit();
    form.remove();

    原文出处:

    [1] panpanpan_, SpringMVC实现文件下载的两种方式, https://blog.csdn.net/a447332241/article/details/78998239

    [2] qq_33422712, SpringMvc 下载和批量下载, https://blog.csdn.net/qq_33422712/article/details/79142350

  • 相关阅读:
    Python开发【第六篇】循环语句
    Python开发【第四篇】语句与函数
    Python开发【第三篇】数据类型
    Python开发【第二篇】:初始Python
    2019-10-11入博客第一篇文章
    vim学习2-文档编辑
    vim学习1-入门指令
    linux学习9-进程管理知识
    linux学习8-正则表达式基础
    linux学习7-数据流重定向
  • 原文地址:https://www.cnblogs.com/ryelqy/p/10104063.html
Copyright © 2011-2022 走看看