目录:
第一章 文件下载
1.1 commons-io.jar工具包
1.2 HttpHeaders类
1.3 ResponseEntity类
1.4 处理下载文件名中文乱码
案例演示
第一章 文件下载
概述:文件下载功能比较简单,通常不需要使用第三方插件,直接使用输入输出流实现功能即可。
通常情况下使用链接地址指向要下载的文件,浏览器会尽可能解析对应的文件,只要是能够在浏览器窗口展示,就会直接显示,而不是提示下载。
1.1 commons-io.jar工具包
(1) IOUtils类
void copy(InputStream input, OutputStream output):文件复制。
(2) FileUtils类
writeStringToFile(Flie file, String data, String encoding):将指定的数据写入到文件中。
readFileToByteArray(File file):将指定文件转换成字符数组。
1.2 HttpHeaders类
set(String headname, String headvalue):设置响应头信息,设置文件MIME类型(媒体类型)
setContentDispositionFormData(String name,String filename):设置以附件的形式处理文件
1.3 ResponseEntity类
ResponseEntity<byte[]>(byte[] byte,HttpHeaders httpHeaders,HttpStatus status):ResponseEntity构造方法,参数:字节数组、响应头、状态码
1.4 处理下载文件名中文乱码
Firefox浏览器下载中文文件的时候采用的是Base64的编码.
IE浏览器,谷歌浏览器等,下载中文文件的时候采用的URL的编码.
案例演示:
前端页面:
<a href="downLoad/downLoadFile.do?filename=1.docx">1.docx</a><br> <a href="downLoad/downLoadFile.do?filename=1.jpg">1.jpg</a><br> <a href="downLoad/downLoadFile.do?filename=1.mp4">1.mp4</a><br> <a href="downLoad/downLoadFile.do?filename=1.txt">1.txt</a><br> <a href="downLoad/downLoadFile.do?filename=1.zip">1.zip</a><br> <a href="downLoad/downLoadFile.do?filename=你好.jpg">你好.jpg</a><br>
文件下载:
@Autowired private ServletContext content; @RequestMapping("downLoadFile") public ResponseEntity<byte[]> downLoad(String filename, @RequestHeader("User-Agent") String agent) throws IOException { String realPath = content.getRealPath("download"+File.separator+filename); System.out.println("realPath = " + realPath); filename = getFilename(filename,agent); HttpHeaders httpHeaders = new HttpHeaders(); //设置响应头:以附件的形式处理文件 httpHeaders.setContentDispositionFormData("attachment",filename); //设置响应头:设置文件的MIME类型(媒体类型) httpHeaders.set("contentType",content.getMimeType(filename)); return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(new File(realPath)),httpHeaders, HttpStatus.OK); }
处理下载时中文乱码:
public String getFilename(String filename,String agent) throws UnsupportedEncodingException { if (agent.contains("MSIE")) { // IE浏览器 filename = URLEncoder.encode(filename, "utf-8"); filename = filename.replace("+", " "); } else if (agent.contains("Firefox")) { // 火狐浏览器 BASE64Encoder base64Encoder = new BASE64Encoder(); filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else { // 其它浏览器 filename = URLEncoder.encode(filename, "utf-8"); } return filename; }