导致原因:
从IIS或者Tomcat之类的Web服务器通过二进制流下载文件时(比如通过设置Header为Content-disposition:inline),如果被下载的文件是Office2007的dotx,docx,pot等后缀的时候,下载对话框中的图标会变成ZIP的,相应的文件名也会成为zip为扩展后缀的文件。其实出现这样的情况,是由于IE中对下载文件类型的判断,假如找不到相应后缀的MIME的话,会自动根据数据流来判断文件的类型,而微软对Office2007的格式做了和以前完全不同的处理。
以前的Office文档是100%的二进制格式。第三方的工具操作起来非常不方便,而 Office2007从整体上都是基于XML格式的,这里并不是说Office2007文档可以保存成XML格式。而是Office2007默认的文档格式就是XML的(Word的docx、Excel的xlsx等)。也许有人会感到奇怪,用文本编辑器打开docx后,显示的仍然是二进制格式,并不是什么 XML。其实docx并不是普通的XML格式,当然,也不只是一个XML文件,docx本质上是一个zip文件,里面有一系列的xml、目录和其他的文件。如果我们将docx改成zip。就可以用winzip等软件将其解开。
正是由于这样的原因,当MIME中不存在相对应的Office2007类型的情况下,被自动识别为ZIP文件了。解决的方法很简单,在Server端添加MIME映射就可以了。Tomcat的话,可以在Web.xml中找到<mime-mapping></mime-mapping>这样的定义,按照规则添加就可以了,IIS中按照下面的方法添加(以XML为例):
至于什么是MIME,一般的人应该都知道,这里简单的解释一下:
MIME (Multipurpose Internet Mail Extensions,多目的Internet邮件扩展)是创建用于电子邮件交换,网络文档,及企业网和Internet上的其他应用程序中的文件格式的规范。每个MIME格式包含一个MIME内容类型(”MIME type”)和指示存储在这个文件中的数据的子类型。MIME类型和子类型一般以类型/子类型的形式列出。MIME格式的内容广泛用于网络文档中
下面收集了大部分文件的扩展名和相应的MIME对应,有需要的可以在列表中找到并添加。
解决方案:
在Server端添加MIME映射就可以了。如Tomcat , 修改/%tomcat_home%/conf/web.xml
<mime-mapping> <extension>docx</extension> <mime-type>application/vnd.openxmlformats-officedocument.wordprocessingml.document</mime-type> </mime-mapping> <mime-mapping> <extension>xlsx</extension> <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type> </mime-mapping> <mime-mapping> <extension>pptx</extension> <mime-type>application/vnd.openxmlformats-officedocument.presentationml.presentation</mime-type> </mime-mapping>
java代码,修改如下:
package com.billzsoft.core.web.servlet; import java.io.IOException; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.billzsoft.core.util.AppUtil; import com.billzsoft.oa.model.system.FileAttach; import com.billzsoft.oa.service.system.FileAttachService; /** * @description 文档下载代码 * @class FileDownloadServlet * @author 不了了之之了之 * @data 2013-6-19 */ public class FileDownloadServlet extends HttpServlet{ private static final long serialVersionUID = 1L; private FileAttachService fileAttachService=(FileAttachService)AppUtil.getBean("fileAttachService"); protected transient final Log logger = LogFactory.getLog(FileDownloadServlet.class); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String fileId=req.getParameter("fileId"); req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); if(StringUtils.isNotEmpty(fileId)){ FileAttach fileAttach=fileAttachService.get(new Long(fileId)); String ext=fileAttach.getExt(); boolean bOpenInWin = false; String openInWin = req.getParameter("openInWin"); if ( (openInWin != null)&&(openInWin.equals("Y")) ) { bOpenInWin = true; } if(ext.toLowerCase().endsWith("zip")){ resp.setContentType("application/x-zip-compressed"); } else if(ext.toLowerCase().endsWith("rar")){ resp.setContentType("application/octet-stream"); } else if(ext.toLowerCase().endsWith("doc")){ resp.setContentType("application/msword"); } else if(ext.toLowerCase().endsWith("docx")){ logger.debug("下载word2007文档!"); resp.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); } else if(ext.toLowerCase().endsWith("xlsx")) { logger.debug("下载excel2007文档!"); resp.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); }else if(ext.toLowerCase().endsWith("pptx")){ logger.debug("下载ppt2007文档!"); resp.setContentType("application/vnd.openxmlformats-officedocument.presentationml.presentation"); } else if(ext.toLowerCase().endsWith("xls") || ext.toLowerCase().endsWith("csv")){ resp.setContentType("application/ms-excel "); } else if (ext.toLowerCase().endsWith("pdf")){ resp.setContentType("application/pdf"); } else{ resp.setContentType("application/x-msdownload"); } ServletOutputStream out = null; try{ java.io.FileInputStream fileIn =new java.io.FileInputStream(getServletContext().getRealPath("/")+"/attachFiles/"+fileAttach.getFilePath()); resp.setHeader("Cache-Control", "private"); resp.setHeader("Pragma", ""); if (bOpenInWin) { resp.setHeader("Content-Disposition", "inline; filename=" +URLEncoder.encode(fileAttach.getFileName(),"UTF-8")); } else { resp.setHeader("Content-Disposition", "attachment;filename=" +URLEncoder.encode(fileAttach.getFileName(),"UTF-8")); } out = resp.getOutputStream(); byte[] buff = new byte[1024]; int leng = fileIn.read(buff); while(leng>0){ out.write(buff,0,leng); leng = fileIn.read(buff); } }catch(Exception ex){ ex.printStackTrace(); }finally{ if(out!=null){ try { out.flush(); } catch (IOException e) { e.printStackTrace(); } try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
附录:
下面收集了大部分文件的扩展名和相应的MIME对应,有需要的可以在列表中找到并添加。
.asx,video/x-ms-asf .xml,text/xml .tsv,text/tab-separated-values .ra,audio/x-pn-realaudio .sv4crc,application/x-sv4crc .spc,application/x-pkcs7-certificates .pmc,application/x-perfmon .lit,application/x-ms-reader .crd,application/x-mscardfile .isp,application/x-internet-signup .wmlsc,application/vnd.wap.wmlscriptc .vst,application/vnd.visio .xlam,application/vnd.ms-excel.addin.macroEnabled.12 .ttf,application/octet-stream .pfm,application/octet-stream .csv,application/octet-stream .aaf,application/octet-stream .one,application/onenote .hta,application/hta .atom,application/atom+xml .323,text/h323 .mhtml,message/rfc822 .midi,audio/mid .p7r,application/x-pkcs7-certreqresp .mny,application/x-msmoney .clp,application/x-msclip .vsd,application/vnd.visio .lpk,application/octet-stream .bin,application/octet-stream .onetoc,application/onenote .x,application/directx .wvx,video/x-ms-wvx .vcf,text/x-vcard .htc,text/x-component .htt,text/webviewhtml .h,text/plain .mht,message/rfc822 .mid,audio/mid .p7b,application/x-pkcs7-certificates .gz,application/x-gzip .dvi,application/x-dvi .cpio,application/x-cpio .vdx,application/vnd.ms-visio.viewer .sldm,application/vnd.ms-powerpoint.slide.macroEnabled.12 .xlm,application/vnd.ms-excel .fdf,application/vnd.fdf .setreg,application/set-registration-initiation .eps,application/postscript .p7s,application/pkcs7-signature .toc,application/octet-stream .mdp,application/octet-stream .ics,application/octet-stream .chm,application/octet-stream .asi,application/octet-stream .afm,application/octet-stream .evy,application/envoy .wmp,video/x-ms-wmp .qt,video/quicktime .mpv2,video/mpeg .xslt,text/xml .etx,text/x-setext .cod,image/cis-cod .snd,audio/basic .au,audio/basic .man,application/x-troff-man .qtl,application/x-quicktimeplayer .pmw,application/x-perfmon .class,application/x-java-applet .iii,application/x-iphone .csh,application/x-csh .z,application/x-compress .vtx,application/vnd.visio .vsw,application/vnd.visio .wps,application/vnd.ms-works .potx,application/vnd.openxmlformats-officedocument.presentationml.template .ps,application/postscript .p7c,application/pkcs7-mime .thn,application/octet-stream .mso,application/octet-stream .dot,application/msword .doc,application/msword .sgml,text/sgml .nws,message/rfc822 .pbm,image/x-portable-bitmap .ief,image/ief .wav,audio/wav .texi,application/x-texinfo .mvb,application/x-msmediaview .hdf,application/x-hdf .vsx,application/vnd.visio .dotm,application/vnd.ms-word.template.macroEnabled.12 .docm,application/vnd.ms-word.document.macroEnabled.12 .pptx,application/vnd.openxmlformats-officedocument.presentationml.presentation .psm,application/octet-stream .java,application/octet-stream .eot,application/octet-stream .jar,application/java-archive .mpeg,video/mpeg .xsf,text/xml .map,text/plain .uls,text/iuls .rf,image/vnd.rn-realflash .m3u,audio/x-mpegurl .wma,audio/x-ms-wma .aifc,audio/aiff .mdb,application/x-msaccess .mvc,application/x-miva-compiled .stl,application/vnd.ms-pki.stl .ppsx,application/vnd.openxmlformats-officedocument.presentationml.slideshow .xlsb,application/vnd.ms-excel.sheet.binary.macroEnabled.12 .setpay,application/set-payment-initiation .prm,application/octet-stream .mix,application/octet-stream .lzh,application/octet-stream .hhk,application/octet-stream .onepkg,application/onenote .xaf,x-world/x-vrml .flr,x-world/x-vrml .IVF,video/x-ivf .cnf,text/plain .asm,text/plain .tiff,image/tiff .wax,audio/x-ms-wax .ms,application/x-troff-ms .tcl,application/x-tcl .shar,application/x-shar .sh,application/x-sh .nc,application/x-netcdf .hlp,application/winhlp .oda,application/oda .pfb,application/octet-stream .fla,application/octet-stream .wm,video/x-ms-wm .rgb,image/x-rgb .ppm,image/x-portable-pixmap .ram,audio/x-pn-realaudio .sit,application/x-stuffit .dir,application/x-director .mpp,application/vnd.ms-project .xla,application/vnd.ms-excel .ssm,application/streamingmedia .axs,application/olescript .ods,application/oleobject .psp,application/octet-stream .jpb,application/octet-stream .wrz,x-world/x-vrml .m1v,video/mpeg .mno,text/xml .cmx,image/x-cmx .jpeg,image/jpeg .dib,image/bmp .rmi,audio/mid .aiff,audio/aiff .wmd,application/x-ms-wmd .wri,application/x-mswrite .pub,application/x-mspublisher .ins,application/x-internet-signup .wks,application/vnd.ms-works .xls,application/vnd.ms-excel .ai,application/postscript .crl,application/pkix-crl .qxd,application/octet-stream .dwp,application/octet-stream .xof,x-world/x-vrml .wmv,video/x-ms-wmv .nsc,video/x-ms-asf .mpa,video/mpeg .pnm,image/x-portable-anymap .rpm,audio/x-pn-realaudio-plugin .aif,audio/x-aiff .me,application/x-troff-me .pml,application/x-perfmon .trm,application/x-msterminal .m13,application/x-msmediaview .js,application/x-javascript .dxr,application/x-director .potm,application/vnd.ms-powerpoint.template.macroEnabled.12 .xltx,application/vnd.openxmlformats-officedocument.spreadsheetml.template .xlt,application/vnd.ms-excel .xlc,application/vnd.ms-excel .p10,application/pkcs10 .smi,application/octet-stream .sea,application/octet-stream .hqx,application/mac-binhex40 .spl,application/futuresplash .movie,video/x-sgi-movie .lsf,video/x-la-asf .txt,text/plain .jfif,image/pjpeg .jpe,image/jpeg .zip,application/x-zip-compressed .wmf,application/x-msmetafile .m14,application/x-msmediaview .latex,application/x-latex .wcm,application/vnd.ms-works .pptm,application/vnd.ms-powerpoint.presentation.macroEnabled.12 .xlsx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet .hhp,application/octet-stream .aca,application/octet-stream .accdb,application/msaccess .jcz,application/liquidmotion .wrl,x-world/x-vrml .wmx,video/x-ms-wmx .asr,video/x-ms-asf .lsx,video/x-la-asf .xsl,text/xml .html,text/html .tif,image/tiff .der,application/x-x509-ca-cert .pfx,application/x-pkcs12 .p12,application/x-pkcs12 .ppsm,application/vnd.ms-powerpoint.slideshow.macroEnabled.12 .cur,application/octet-stream .accdt,application/msaccess .hdml,text/x-hdml .htm,text/html .xbm,image/x-xbitmap .jpg,image/jpeg .texinfo,application/x-texinfo .ppam,application/vnd.ms-powerpoint.addin.macroEnabled.12 .xlw,application/vnd.ms-excel .rm,application/vnd.rn-realmedia .pdf,application/pdf .rar,application/octet-stream .psd,application/octet-stream .inf,application/octet-stream .emz,application/octet-stream .dsp,application/octet-stream .onea,application/onenote .jck,application/liquidmotion .mpe,video/mpeg .mp2,video/mpeg .sct,text/scriptlet .ras,image/x-cmu-raster .swf,application/x-shockwave-flash .wmz,application/x-ms-wmz .gtar,application/x-gtar .dcr,application/x-director .sldx,application/vnd.openxmlformats-officedocument.presentationml.slide .pps,application/vnd.ms-pps .p7m,application/pkcs7-mime .xsn,application/octet-stream .ocx,application/octet-stream .accde,application/msaccess .mov,video/quicktime .wmls,text/vnd.wap.wmlscript .cpp,text/plain .c,text/plain .bas,text/plain .css,text/css .art,image/x-jg .mp3,audio/mpeg .t,application/x-troff .roff,application/x-troff .tar,application/x-tar .hhc,application/x-oleobject .scd,application/x-msschedule .pko,application/vnd.ms-pki.pko .sst,application/vnd.ms-pki.certstore .ppt,application/vnd.ms-powerpoint .xtp,application/octet-stream .u32,application/octet-stream .pcx,application/octet-stream .msi,application/octet-stream .exe,application/octet-stream .asd,application/octet-stream .onetoc2,application/onenote .fif,application/fractals .mpg,video/mpeg .vml,text/xml .xdr,text/plain .vcs,text/plain .hxt,text/html .eml,message/rfc822 .xpm,image/x-xpixmap .ico,image/x-icon .gif,image/gif .dwf,drawing/x-dwf .src,application/x-wais-source .tr,application/x-troff .pmr,application/x-perfmon .pma,application/x-perfmon .dll,application/x-msdownload .bcpio,application/x-bcpio .wmlc,application/vnd.wap.wmlc .wdb,application/vnd.ms-works .dotx,application/vnd.openxmlformats-officedocument.wordprocessingml.template .docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document .pot,application/vnd.ms-powerpoint .xltm,application/vnd.ms-excel.template.macroEnabled.12 .rtf,application/rtf .prf,application/pics-rules .snp,application/octet-stream .cab,application/octet-stream .avi,video/x-msvideo .asf,video/x-ms-asf .dtd,text/xml .wml,text/vnd.wap.wml .vbs,text/vbscript .rtx,text/richtext .dlm,text/dlm .xwd,image/x-xwindowdump .pgm,image/x-portable-graymap .bmp,image/bmp .crt,application/x-x509-ca-cert .ustar,application/x-ustar .tex,application/x-tex .sv4cpio,application/x-sv4cpio .tgz,application/x-compressed .cdf,application/x-cdf .vss,application/vnd.visio .cat,application/vnd.ms-pki.seccat .thmx,application/vnd.ms-officetheme .xlsm,application/vnd.ms-excel.sheet.macroEnabled.12 .prx,application/octet-stream .pcz,application/octet-stream .onetmp,application/onenote .acx,application/internet-property-stream .wsdl,text/xml .disco,text/xml .xsd,text/xml .wbmp,image/vnd.wap.wbmp .png,image/png .pnz,image/png .smd,audio/x-smd .smz,audio/x-smd .smx,audio/x-smd .mmf,application/x-smaf