SSM框架(Spring+SpringMVC+MyBatis)中SpingMVC环境中的文件下载

SSM框架Spring+SpringMVC+MyBatis中SpingMVC环境中的文件下载 eclipse

文件下载

文件下载是指文件服务器上的文件下载到本机上,在SpringMVC中环境中,实现文件下载大致可分为两个步骤。

步骤1

在客户端也就是前端页面使用一个文件下载的超链接,该链接的href属性要指定后台文件下载的方法以及文件名(需要先在文件下载目录中添加了一个名称为“姓名.jpg”的文件),具体代码如下:

<a href="${pageContext.request.contextPath }/download?filename=<%=URLEncoder.encode("姓名.jpg","UTF-8") %>">文件下载</a>

其中若使用<%=URLEncoder.encode(“姓名.jpg”,“UTF-8”) %>,这段话的意思是将中文转为UTF-8编码,则必须在jsp页面的这行代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

后加入一行代码

 <%@ page import="java.net.URLEncoder" %>

文件位置
赵琳文件下载

步骤2

修改控制类中的文件,并增加对文件名进行编码的方法(本控制器是针对中文文件名来进行的编程),代码如下所示:

@RequestMapping("/download")
	public ResponseEntity<byte[]> filedownload(HttpServletRequest request,@RequestParam("filename")String filename) throws IOException{
		//指定要下载的文件路径
		String  path=request.getServletContext().getRealPath("/filedownload/");
		//创建该文件对象
		File file = new File(path+File.separator+filename);
		//对文件名编码,防止中文文件乱码
		filename=this.getFilename(request,filename);
		//设置响应头
		HttpHeaders headers=new HttpHeaders();
		//通知浏览器以下载的方式打开文件
		headers.setContentDispositionFormData("attachment", filename);
		//定义以流的形式下载返回文件数据
		headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
		//使用Spring MVC框架的ResponseEntity对象封装返回下载数据
		return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.OK);
	}
	/**
	 * 根据浏览器的不同进行编码设置,返回编码后的文件名
	 */
	private String getFilename(HttpServletRequest request, String filename) throws IOException{
		//IE不同版本User-Agent中出现的关键词
		String[] IEBrowserKeyWords = {"MSIE","Trident","Edge"};
		//获取请求头代理信息
		String  userAgent = request.getHeader("User-Agent");
		for(String keyWord : IEBrowserKeyWords) {
			if(userAgent.contains(keyWord)) {
				//IE内核浏览器,统一为UTF-8
				return URLEncoder.encode(filename,"UTF-8");
			}
		}
		//其他浏览器统一为ISO-8859-1编码显示
		return new String(filename.getBytes("UTF-8"),"ISO-8859-1");

	}

若不是中文文件下载,则可以尝试这种方式(该方法为课本原本方法,本人并未尝试):

	@RequestMapping("/download")
	public ResponseEntity<byte[]> fileDownload(HttpServletRequest request,
	                                           String filename) throws Exception{
    // 指定要下载的文件所在路径
	    String path = request.getServletContext().getRealPath("/upload/");
	    // 创建该文件对象
	    File file = new File(path+File.separator+filename);
	    // 设置响应头
	    HttpHeaders headers = new HttpHeaders();
	    // 通知浏览器以下载的方式打开文件
      headers.setContentDispositionFormData("attachment", filename);
	    // 定义以流的形式下载返回文件数据
	    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
	    // 使用Sring MVC框架的ResponseEntity对象封装返回下载数据
	   return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
                                                       headers,HttpStatus.OK);
	}
	





(希望这篇博客可以帮到你)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值