SpringMVC 文件下载

核心代码如下:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", new String(URLDecoder.decode(name, Constants.UTF8).getBytes(Constants.UTF8), Constants.ISO_8859_1));
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(new File(URLDecoder.decode(path, Constants.UTF8))), headers, HttpStatus.CREATED)

1、下载乱码

2、IE 提示无法下载此文件

SpringMVC 文件下载_第1张图片

解决方案如下:

1、乱码 

对文件名进行编码,

String fileName = URLEncoder.encode(atta.getFileName(), "UTF-8");
        /*
         * see http://support.microsoft.com/default.aspx?kbid=816868
         */
    if (fileName.length() > 150) {
          String guessCharset = xxxx /*根据request的locale 得出可能的编码,中文操作系统通常是gb2312*/
          fileName = new String(atta.getFileName().getBytes(guessCharset), "ISO8859-1"); 
   }
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

参考:http://lj830723.iteye.com/blog/1415479

2、无法下载

//源码 package org.springframework.http; public enum HttpStatus 
	/**
	 * {@code 200 OK}.
	 * @see <a href="http://tools.ietf.org/html/rfc2616#section-10.2.1">HTTP/1.1</a>
	 */
OK(200, "OK"),
	/**
	 * {@code 201 Created}.
	 * @see <a href="http://tools.ietf.org/html/rfc2616#section-10.2.2">HTTP/1.1</a>
	 */
CREATED(201, "Created")

//修改为 HttpStatus.OK
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(new File(path)), headers, HttpStatus.OK)

IE对http1.1支持不够完善. IE不支持201状态码。

状态码:http://tool.oschina.net/commons?type=5


你可能感兴趣的:(SpringMVC 文件下载)