浅谈MIME之文件下载
要实现文件下载,我们只需要设置两个特殊的相应头。
它们是什么头?如果文件名带中文,该如何解决?
两个特殊的相应头:
Content-Type: application/octet-stream
它定义了数据的类型,以便数据能被适当的处理。有效的类型有:text,image,audio,video,applications,multipart和message。注意任何一个二进制附件都应该被叫做application/octet- stream。这个头的一些用例为:image/jpg, application/mswork,multipart/mixed,这只是很少的一部分。
分类大全参考网址:https://blog.csdn.net/weixin_43209201/article/details/86532261
Content-Disposition: attachment;filename=test.zip
一个试验性的头,它用于给客户程序/MUA提供提示,来决定是否在行内显示附件或作为单独的附件。当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。
例如:
response.setHeader("Content-Disposition","attachment;filename=test.jpg");
response.setContentType("image/jpeg");
注意:如果文件中filename参数中有中文,则就会出现乱码。
解决办法:
response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("utf-8"),"iso8859-1"));
response.setContentType("application/ynd.ms-excel;charset=UTF-8");
测试并分析文件名乱码问题
response.setHeader()下载中文文件名乱码问题response.setHeader("Content-Disposition", "attachment; filename=" + >java.net.URLEncoder.encode(fileName, "UTF-8"));
下载的程序里有了上面一句,一般在IE6的下载提示框上将正确显示文件的名字,无论是简体中文,还是日文。不过当时确实没有仔细测试文件名为很长的中文文件名的情况。现如今经过仔细测试,发现文字只要超过17个字,就不能下载了。分析如下:
一. 通过原来的方式,也就是先用URLEncoder编码,当中文文字超过17个时,IE6 无法下载文件。这是IE的bug,参见微软的知识库文章 KB816868 。原因可能是IE在处理 Response Header 的时候,对header的长度限制在150字节左右。而一个汉字编码成UTF-8是9个字节,那么17个字便是153个字节,所以会报错。而且不跟后缀也 不对.
二. 解决方案:将文件名编码成ISO8859-1是有效的解决方案,代码如下:response.setHeader( "Content-Disposition", "attachment;filename=" + new >String