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);    
	    } 

另外需要注意的一点

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();


  • 11
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
通过SpringMVC,可以使用以下方式下载文件: 1. 使用 HttpServletResponse 的 OutputStream 将文件流写入响应中,然后通过设置响应的 Content-Disposition 头信息来指定文件名和下载方式。 2. 使用 Spring 的 Resource 接口获取文件流,并使用 Spring 的 ResponseEntity 返回文件流,通过设置响应头信息来指定文件名和下载方式。 以下是两种方式的样例代码: 1. 使用 HttpServletResponse: ```java @RequestMapping("/download") public void downloadFile(HttpServletResponse response) throws IOException { String fileName = "example.pdf"; String filePath = "/path/to/example.pdf"; File file = new File(filePath); response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "attachment; filename=" + fileName); response.setHeader("Content-Length", String.valueOf(file.length())); FileInputStream fileInputStream = new FileInputStream(file); OutputStream outputStream = response.getOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = fileInputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } outputStream.flush(); outputStream.close(); fileInputStream.close(); } ``` 2. 使用 Spring 的 Resource 和 ResponseEntity: ```java @RequestMapping("/download") public ResponseEntity<Resource> downloadFile() { String fileName = "example.pdf"; String filePath = "/path/to/example.pdf"; File file = new File(filePath); Resource resource = new FileSystemResource(file); HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName); return ResponseEntity.ok() .headers(headers) .contentLength(file.length()) .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(resource); } ``` 这些方法都可以用于下载文件,具体使用哪种方式取决于你的需求和代码实现

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值