IE Office 2007ファイルアップロード時にアップロードダイアログでZIPファイルになる問題の解決


IE Office 2007ファイルアップロード時にアップロードダイアログでZIPファイルになる問題の解決
原因:
IISやTomcatのようなWebサーバからバイナリストリームを介してファイルをダウンロードする場合(例えば、HeaderをContent-disposition:inlineと設定することにより)ダウンロードされるファイルがOffice 2007のdotx,docx,potなどの接尾辞である場合、ダウンロードダイアログボックスのアイコンはZIPとなり、対応するファイル名もzipが拡張接尾辞となるファイルとなる.このような場合、IEにおけるダウンロードファイルタイプの判断により、対応する接尾辞のMが見つからないIMEの場合、データストリームによってファイルの種類が自動的に判断されますが、マイクロソフトはOffice 2007のフォーマットについて以前とは全く異なる処理をしています.
以前のOfficeドキュメントは100%バイナリ形式でした.サードパーティ製のツールは操作が非常に不便ですが、Office 2007は全体的にXML形式に基づいています.ここではOffice 2007ドキュメントをXML形式に保存できるわけではありません.Office 2007のデフォルトのドキュメントフォーマットはXMLです(Wordのdocx、Excelのxlsxなど).不思議に思う人もいるかもしれませんが、テキストエディタでdocxを開くと、やはりバイナリ形式で、XMLではありません.実はdocxは普通のXML形式ではありません.もちろん、XMLファイルだけではありません.docxは本質的にzipファイルで、xml、ディレクトリ、その他のファイルが一連入っています.docxを変更するとzipになる.winzipなどのソフトで解くことができます.
そのため、MIMEに対応するOffice 2007タイプが存在しない場合、ZIPファイルとして自動的に認識される.解決策は簡単で、サーバー側にMIMEマッピングを追加すればいいです.TomcatならWeb.xmlではという定義を見つけ、ルールに従って追加すればよいが、IISでは以下の方法で追加する(XMLを例にとる):
「Default Web Site」を選択し、「Properties」ダイアログ・ボックスを開きます.
HTTP Headersラベルを選択します.
「MIME Map」で、「File Type」タブをクリックし、「New Type」を選択します.
Extensionドメインに入力します.xml、Content Typeドメインにtext/xmlと入力し、「OK」をクリックします.
MIMEとは何か、一般の人は知っているはずですが、ここで簡単に説明します.MIME(Multipurpose Internet Mail Extensions、多目的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