解决各大浏览器下载文件名显示不正确的情况

来源:互联网 发布:我国经济发展数据 编辑:程序博客网 时间:2024/04/27 16:22

下载时,最关键的三步:

response.reset();//清空缓存区,防止存在某些字符使得下载的文件格式错误
response.setContentType("application/pdf;charset=UTF-8");//指定文件类型,其他类型可参见w3school的文档,也可参见下文的附录标准
response.setHeader("Content-Disposition", "attachment;filename=temp.pdf");// attachment后面一定是逗号,这个地方我就犯过错误,写成了:,结果死活不对


解决下载时,中文文件名显示不正确的方法:

理论依据:

浏览器能正确识别的编码格式,只要按照这样的编码来设置对应的Content-Disposition,那么应该就不会出现中文文件名的乱码问题了。 
首先,Content-Disposition值可以有以下几种编码格式 
1. 直接urlencode: 
    Content-Disposition: attachment; filename="struts2.0%E4%B8%AD%E6%96%87%E6%95%99%E7%A8%8B.chm" 
2. Base64编码: 
    Content-Disposition: attachment; filename="=?UTF8?B?c3RydXRzMi4w5Lit5paH5pWZ56iLLmNobQ==?=" 
3. RFC2231规定的标准: 
    Content-Disposition: attachment; filename*=UTF-8''%E5%9B%9E%E6%89%A7.msg 
4. 直接ISO编码的文件名: 
    Content-Disposition: attachment;filename="测试.txt" 
然后,各浏览器支持的对应编码格式为: 
1.  IE浏览器,采用URLEncoder编码 
2.  Opera浏览器,采用filename*方式 
3.  Safari浏览器,采用ISO编码的中文输出 
4.  Chrome浏览器,采用Base64编码或ISO编码的中文输出 
5.  FireFox浏览器,采用Base64或filename*或ISO编码的中文输出 

源代码:

private String getDownLoadFileName(String filename) {String new_filename = null;try {new_filename = URLEncoder.encode(filename, "UTF8");} catch (UnsupportedEncodingException e1) {e1.printStackTrace();}HttpServletRequest request = ServletActionContext.getRequest();String userAgent = request.getHeader("User-Agent");// System.out.println(userAgent);String rtn = "filename=\"" + new_filename + "\"";// 如果没有UA,则默认使用IE的方式进行编码,因为毕竟IE还是占多数的if (userAgent != null) {userAgent = userAgent.toLowerCase();// IE浏览器,只能采用URLEncoder编码if (userAgent.indexOf("msie") != -1) {rtn = "filename=\"" + new_filename + "\"";}// Opera浏览器只能采用filename*else if (userAgent.indexOf("opera") != -1) {rtn = "filename*=UTF-8''" + new_filename;}// Safari浏览器,只能采用ISO编码的中文输出else if (userAgent.indexOf("safari") != -1) {try {rtn = "filename=\""+ new String(filename.getBytes("UTF-8"),"ISO8859-1") + "\"";} catch (UnsupportedEncodingException e) {e.printStackTrace();}}// Chrome浏览器,只能采用MimeUtility编码或ISO编码的中文输出else if (userAgent.indexOf("applewebkit") != -1) {try {new_filename = MimeUtility.encodeText(filename, "UTF8", "B");} catch (UnsupportedEncodingException e) {e.printStackTrace();}rtn = "filename=\"" + new_filename + "\"";}// FireFox浏览器,可以使用MimeUtility或filename*或ISO编码的中文输出else if (userAgent.indexOf("mozilla") != -1) {rtn = "filename*=UTF-8''" + new_filename;}}return rtn;}

基本能解决大部分浏览器中文显示不正常的情况,但是,浏览器还有版本的,所以最好的方式就是能不用中文的时候,尽量别用中文


附录:

按照文件扩展名排列的 Mime 类型列表

扩展名类型/子类型 application/octet-stream323text/h323acxapplication/internet-property-streamaiapplication/postscriptaifaudio/x-aiffaifcaudio/x-aiffaiffaudio/x-aiffasfvideo/x-ms-asfasrvideo/x-ms-asfasxvideo/x-ms-asfauaudio/basicavivideo/x-msvideoaxsapplication/olescriptbastext/plainbcpioapplication/x-bcpiobinapplication/octet-streambmpimage/bmpctext/plaincatapplication/vnd.ms-pkiseccatcdfapplication/x-cdfcerapplication/x-x509-ca-certclassapplication/octet-streamclpapplication/x-msclipcmximage/x-cmxcodimage/cis-codcpioapplication/x-cpiocrdapplication/x-mscardfilecrlapplication/pkix-crlcrtapplication/x-x509-ca-certcshapplication/x-cshcsstext/cssdcrapplication/x-directorderapplication/x-x509-ca-certdirapplication/x-directordllapplication/x-msdownloaddmsapplication/octet-streamdocapplication/msworddotapplication/msworddviapplication/x-dvidxrapplication/x-directorepsapplication/postscriptetxtext/x-setextevyapplication/envoyexeapplication/octet-streamfifapplication/fractalsflrx-world/x-vrmlgifimage/gifgtarapplication/x-gtargzapplication/x-gziphtext/plainhdfapplication/x-hdfhlpapplication/winhlphqxapplication/mac-binhex40htaapplication/htahtctext/x-componenthtmtext/htmlhtmltext/htmlhtttext/webviewhtmlicoimage/x-iconiefimage/iefiiiapplication/x-iphoneinsapplication/x-internet-signupispapplication/x-internet-signupjfifimage/pipegjpeimage/jpegjpegimage/jpegjpgimage/jpegjsapplication/x-javascriptlatexapplication/x-latexlhaapplication/octet-streamlsfvideo/x-la-asflsxvideo/x-la-asflzhapplication/octet-streamm13application/x-msmediaviewm14application/x-msmediaviewm3uaudio/x-mpegurlmanapplication/x-troff-manmdbapplication/x-msaccessmeapplication/x-troff-memhtmessage/rfc822mhtmlmessage/rfc822midaudio/midmnyapplication/x-msmoneymovvideo/quicktimemovievideo/x-sgi-moviemp2video/mpegmp3audio/mpegmpavideo/mpegmpevideo/mpegmpegvideo/mpegmpgvideo/mpegmppapplication/vnd.ms-projectmpv2video/mpegmsapplication/x-troff-msmvbapplication/x-msmediaviewnwsmessage/rfc822odaapplication/odap10application/pkcs10p12application/x-pkcs12p7bapplication/x-pkcs7-certificatesp7capplication/x-pkcs7-mimep7mapplication/x-pkcs7-mimep7rapplication/x-pkcs7-certreqrespp7sapplication/x-pkcs7-signaturepbmimage/x-portable-bitmappdfapplication/pdfpfxapplication/x-pkcs12pgmimage/x-portable-graymappkoapplication/ynd.ms-pkipkopmaapplication/x-perfmonpmcapplication/x-perfmonpmlapplication/x-perfmonpmrapplication/x-perfmonpmwapplication/x-perfmonpnmimage/x-portable-anymappot,application/vnd.ms-powerpointppmimage/x-portable-pixmapppsapplication/vnd.ms-powerpointpptapplication/vnd.ms-powerpointprfapplication/pics-rulespsapplication/postscriptpubapplication/x-mspublisherqtvideo/quicktimeraaudio/x-pn-realaudioramaudio/x-pn-realaudiorasimage/x-cmu-rasterrgbimage/x-rgbrmiaudio/midroffapplication/x-troffrtfapplication/rtfrtxtext/richtextscdapplication/x-msschedulescttext/scriptletsetpayapplication/set-payment-initiationsetregapplication/set-registration-initiationshapplication/x-shsharapplication/x-sharsitapplication/x-stuffitsndaudio/basicspcapplication/x-pkcs7-certificatessplapplication/futuresplashsrcapplication/x-wais-sourcesstapplication/vnd.ms-pkicertstorestlapplication/vnd.ms-pkistlstmtext/htmlsvgimage/svg+xmlsv4cpioapplication/x-sv4cpiosv4crcapplication/x-sv4crcswfapplication/x-shockwave-flashtapplication/x-trofftarapplication/x-tartclapplication/x-tcltexapplication/x-textexiapplication/x-texinfotexinfoapplication/x-texinfotgzapplication/x-compressedtifimage/tifftiffimage/tifftrapplication/x-trofftrmapplication/x-msterminaltsvtext/tab-separated-valuestxttext/plainulstext/iulsustarapplication/x-ustarvcftext/x-vcardvrmlx-world/x-vrmlwavaudio/x-wavwcmapplication/vnd.ms-workswdbapplication/vnd.ms-workswksapplication/vnd.ms-workswmfapplication/x-msmetafilewpsapplication/vnd.ms-workswriapplication/x-mswritewrlx-world/x-vrmlwrzx-world/x-vrmlxafx-world/x-vrmlxbmimage/x-xbitmapxlaapplication/vnd.ms-excelxlcapplication/vnd.ms-excelxlmapplication/vnd.ms-excelxlsapplication/vnd.ms-excelxltapplication/vnd.ms-excelxlwapplication/vnd.ms-excelxofx-world/x-vrmlxpmimage/x-xpixmapxwdimage/x-xwindowdumpzapplication/x-compresszipapplication/zip


原创粉丝点击