Struts2温习(10)--文件上传

自接触这么多种技术的上传来看,还是Struts2的上传最好用,虽然之前有篇文章已经总结了几乎我接触到的所有类型的上传,但Struts2方面感觉讲的还是不够细致。
本文就单文件上传和批量文件上传来进行讲解
具体示例
首页上传页面

Html代码 
<span style="font-size: large;"><span style="font-size: large;"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
<%@ taglib uri="/struts-tags" prefix="s" %>  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
  <head>  
    <title>Struts2文件上传示例</title>  
    <meta http-equiv="pragma" content="no-cache">  
    <meta http-equiv="cache-control" content="no-cache">  
    <meta http-equiv="expires" content="0">      
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
    <meta http-equiv="description" content="This is my page">  
    <!-- 
    <link rel="stylesheet" type="text/css" href="styles.css"> 
    -->  
  </head>  
    
  <body>  
    <h3>Struts2文件上传示例</h3><hr/>  
      
    <form action="fileUpload.action" method="post" enctype="multipart/form-data">  
        <input type="file" name="up" style="width: 500px"/> <s:fielderror name="up"></s:fielderror><br/>  
        <input type="submit" value="开始上传"/>  
        <s:token/>  
    </form>  
      
    <h3>Struts2批量文件上传示例</h3><hr/>  
      
    <form action="batchFileUpload.action" method="post" enctype="multipart/form-data">  
    <s:fielderror name="up"></s:fielderror><br/>  
        <input type="file" name="up" style="width: 500px"/> <br/>  
        <input type="file" name="up" style="width: 500px"/><br/>  
        <input type="file" name="up" style="width: 500px"/> <br/>  
        <input type="submit" value="开始上传"/>  
        <s:token/>  
    </form>  
      
  </body>  
</html></span></span>
 

单文件上传的Action

Java代码 
<span style="font-size: large;"><span style="font-size: large;">package com.javacrazyer.action;  
  
import java.io.BufferedInputStream;  
import java.io.BufferedOutputStream;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
  
import org.apache.struts2.ServletActionContext;  
  
import com.opensymphony.xwork2.ActionSupport;  
  
  
public class FileUploadAction extends ActionSupport {  
      
    private static final long serialVersionUID = -7001482935770262132L;  
    private File up;   
    private String upContentType;  
    private String upFileName;  
    private String destPath;  
  
    public String execute() throws Exception{  
          
        System.out.println("contentType==" + this.upContentType);  
        System.out.println("fileName==" + this.upFileName);  
          
        File basePath = new File(ServletActionContext.getServletContext().getRealPath(destPath));  
          
        if(!basePath.exists()){  
            basePath.mkdirs();  
        }  
          
        copy(up, new File(basePath.getCanonicalPath()+"/" + upFileName));  
          
        return SUCCESS;  
    }  
  
      
    public void copy(File srcFile, File destFile) throws IOException{  
        BufferedInputStream bis = null;  
        BufferedOutputStream bos = null;  
          
        try{  
            bis = new BufferedInputStream(new FileInputStream(srcFile));  
            bos = new BufferedOutputStream(new FileOutputStream(destFile));  
            byte[] buf = new byte[8192];  
              
            for(int count = -1; (count = bis.read(buf))!= -1; ){  
                bos.write(buf, 0, count);  
            }  
            bos.flush();  
        }catch(IOException ie){  
            throw ie;  
        }finally{  
            if(bis != null){  
                bis.close();  
            }  
            if(bos != null){  
                bos.close();  
            }  
        }  
    }  
      
      
  
    public File getUp() {  
        return up;  
    }  
  
  
    public void setUp(File up) {  
        this.up = up;  
    }  
  
  
    public String getUpContentType() {  
        return upContentType;  
    }  
  
  
    public void setUpContentType(String upContentType) {  
        this.upContentType = upContentType;  
    }  
  
  
    public String getUpFileName() {  
        return upFileName;  
    }  
  
  
    public void setUpFileName(String upFileName) {  
        this.upFileName = upFileName;  
    }  
  
  
    public String getDestPath() {  
        return destPath;  
    }  
  
    public void setDestPath(String destPath) {  
        this.destPath = destPath;  
    }  
      
}</span></span> 


多文件上传的Action

Java代码 
<span style="font-size: large;"><span style="font-size: large;">package com.javacrazyer.action;  
  
import java.io.BufferedInputStream;  
import java.io.BufferedOutputStream;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.util.ArrayList;  
import java.util.List;  
  
import org.apache.struts2.ServletActionContext;  
  
import com.opensymphony.xwork2.ActionSupport;  
  
/** 
 * 批量文件上传 
 *  
 * 这里有一点非常重要:就是凡是页面上的file文本域的name=xxx的, 
 * 那么Action的三个属性必须为xxx,xxxContentType,xxxFileName 
 *  
 *  
 */  
public class BatchFileUploadAction extends ActionSupport {  
      
    private static final long serialVersionUID = -7001482935770262132L;  
      
    private List<File> up;   
    private List<String> upContentType;  
    private List<String> upFileName;  
    private String destPath;  
  
    public String execute() throws Exception{  
          
        //System.out.println("contentType==" + this.upContentType);  
        //System.out.println("fileName==" + this.upFileName);  
          
        File basePath = new File(ServletActionContext.getServletContext().getRealPath(destPath));  
          
        if(!basePath.exists()){  
            basePath.mkdirs();  
        }  
          
        int size = up == null ? 0 : up.size();  
        for(int i = 0; i < size; i++){  
            /* 
             * 如果需要限制上传文件的类型,那么可以解开此注释 
             * if(isAllowType(upContentType.get(i))){ 
                copy(up.get(i), new File(basePath.getCanonicalPath()+"/" + upFileName.get(i))); 
            }else{ 
                upFileName.remove(i); 
            }*/  
            copy(up.get(i), new File(basePath.getCanonicalPath()+"/" + upFileName.get(i)));  
        }  
        return SUCCESS;  
    }  
  
      
    public void copy(File srcFile, File destFile) throws IOException{  
        BufferedInputStream bis = null;  
        BufferedOutputStream bos = null;  
          
        try{  
            bis = new BufferedInputStream(new FileInputStream(srcFile));  
            bos = new BufferedOutputStream(new FileOutputStream(destFile));  
            byte[] buf = new byte[8192];  
              
            for(int count = -1; (count = bis.read(buf))!= -1; ){  
                bos.write(buf, 0, count);  
            }  
            bos.flush();  
        }catch(IOException ie){  
            throw ie;  
        }finally{  
            if(bis != null){  
                bis.close();  
            }  
            if(bos != null){  
                bos.close();  
            }  
        }  
    }  
  
  
    public List<File> getUp() {  
        return up;  
    }  
  
  
    public void setUp(List<File> up) {  
        this.up = up;  
    }  
  
  
    public List<String> getUpContentType() {  
        return upContentType;  
    }  
  
  
    public void setUpContentType(List<String> upContentType) {  
        this.upContentType = upContentType;  
    }  
  
  
    public List<String> getUpFileName() {  
        return upFileName;  
    }  
  
  
    public void setUpFileName(List<String> upFileName) {  
        this.upFileName = upFileName;  
    }  
  
  
    public String getDestPath() {  
        return destPath;  
    }  
  
    public void setDestPath(String destPath) {  
        this.destPath = destPath;  
    }  
  
    public static boolean isAllowType(String type){  
        List<String> types = new ArrayList<String>();  
        types.add("image/pjpeg");  
        types.add("text/plain");  
        types.add("image/gif");  
        types.add("image/x-png");  
          
        if(types.contains(type)){  
            return true;  
        }else{  
            return false;  
        }  
    }  
}</span></span>  

针对上面两个Action,都得有那么三个属性【上传的文件,文件类型,文件名】,并且开头必须与表单file的name值一样


在Action中添加一个List<File>类型的与页面所有file域同名的属性。private List<File> up;
添加一个以file域名开头,后面跟ContentType的字符串列表属性,这个由Struts2的文件上传拦截器赋文件类型值。如:private List<String> upContentTyp;
        添加一个以file域名开头,后面跟FileName的字符串列表属性,这个由Struts2的文件上传拦截器赋文件名的值。如:private List<String> upFileName;
       通过IO流循环操作,完成文件的读写。

记住:在struts2的Action中,对于无论是单个文件上传还是批量上传,就是凡是页面上的file文本域的name=xxx的, 那么Action的三个属性必须为xxx,xxxContentType,xxxFileName


存放上传类型错误信息的资源文件
msg_zh_CN.properties


Xml代码 
<span style="font-size: large;"><span style="font-size: large;">struts.messages.error.content.type.not.allowed=\u4E0A\u4F20\u7684\u6587\u4EF6\u7C7B\u578B\u662F\u975E\u6CD5\u7684  
#struts.messages.error.uploading=文件不能上传的通用错误信息  
#struts.messages.error.file.too.large=上传文件长度过大的错误信息  
#struts.messages.error.content.type.not.allowed= 当上传文件不符合指定的contentType</span></span>  
 



 
msg_en_US.properties

Html代码 
<span style="font-size: large;"><span style="font-size: large;">struts.messages.error.content.type.not.allowed=upload file contenttype is invalidate</span></span>  

src/struts.xml

Xml代码 
<span style="font-size: large;"><span style="font-size: large;"><?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE struts PUBLIC  
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"  
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">  
<struts>  
    <!-- 请求参数的编码方式 -->  
    <constant name="struts.i18n.encoding" value="UTF-8"/>  
    <!-- 指定被struts2处理的请求后缀类型。多个用逗号隔开 -->  
    <constant name="struts.action.extension" value="action,do,go,xkk"/>  
    <!-- 当struts.xml改动后,是否重新加载。默认值为false(生产环境下使用),开发阶段最好打开  -->  
    <constant name="struts.configuration.xml.reload" value="true"/>  
    <!-- 是否使用struts的开发模式。开发模式会有更多的调试信息。默认值为false(生产环境下使用),开发阶段最好打开  -->  
    <constant name="struts.devMode" value="false"/>  
    <!-- 设置浏览器是否缓存静态内容。默认值为true(生产环境下使用),开发阶段最好关闭  -->  
    <constant name="struts.serve.static.browserCache" value="false" />  
    <!-- 是否允许在OGNL表达式中调用静态方法,默认值为false -->  
    <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>  
    <!-- 指定由spring负责action对象的创建   
    <constant name="struts.objectFactory" value="spring" />-->  
      
    <constant name="struts.enable.DynamicMethodInvocation" value="false"/>  
    <constant name="struts.multipart.maxSize" value="102400000000000" />   
      
    <constant name="struts.custom.i18n.resources" value="msg"/>  
       
    <package name="my" extends="struts-default" namespace="/">  
    <interceptors>  
            <interceptor-stack name="myStack">  
                <interceptor-ref name="defaultStack"/>  
                <interceptor-ref name="token"/>  
            </interceptor-stack>  
        </interceptors>  
        <default-interceptor-ref name="myStack"/>  
          
        <global-results>  
            <result name="invalid.token">/error.jsp</result>  
        </global-results>  
          
        <action name="fileUpload" class="com.javacrazyer.action.FileUploadAction">  
            <param name="destPath">/abc</param>  
            <result name="input">/index.jsp</result>  
            <result>/success.jsp</result>  
        </action>  
        <action name="batchFileUpload" class="com.javacrazyer.action.BatchFileUploadAction">  
            <param name="destPath">/abc</param>  
            <result name="input">/index.jsp</result>  
            <result>/success.jsp</result>  
        </action>  
          
    </package>  
      
</struts></span></span>
 



token防止重复提交表单【主要是防止上传过后点击浏览器的后退按钮,再次提交这个问题】
  1) 在页面的表单中添加<s:token/>
  2) 在要使用token的Action配置中添加token或tokenSession拦截器。

 
看到没有,我们在配置中还配置了<result name="input">/index.jsp</result>,这样的话,如果上传失败就会跳到index.jsp页面,不过现在
我们还没涉到类型限制的问题,接下来,将的就是如何为上传添加文件类型
struts2中为文件上传添加类型限制有两种方式:
第一种方式在Action纯写代码方式
看BatchFileUploadAction中,copy(up.get(i), new File(basePath.getCanonicalPath()+"/" + upFileName.get(i)));这句话,如果将其上边的被注释的段落注释去掉,将本行注释掉,那么就可以起到文件限制,具体可以在isAllowType这个方法中配置
第二种方式在struts.xml中配置
将上边struts.xml中的

Java代码 
<span style="font-size: large;"><span style="font-size: large;"><interceptors>  
    <interceptor-stack name="myStack">  
        <interceptor-ref name="defaultStack"/>  
        <interceptor-ref name="token"/>  
    </interceptor-stack>  
</interceptors></span></span>
 
替换成下面的

Xml代码 
<span style="font-size: large;"><span style="font-size: large;">     <interceptors>  
    struts2的defaultStack中已经含有fileupload拦截器,如果想加入allowedTypes参数,  
需要从新写一个defaultstack ,拷贝过来修改一下  
            <interceptor-stack name="myStack">  
                <interceptor-ref name="exception"/>  
                <interceptor-ref name="alias"/>  
                <interceptor-ref name="servletConfig"/>  
                <interceptor-ref name="i18n"/>  
                <interceptor-ref name="prepare"/>  
                <interceptor-ref name="chain"/>  
                <interceptor-ref name="debugging"/>  
                <interceptor-ref name="profiling"/>  
                <interceptor-ref name="scopedModelDriven"/>  
                <interceptor-ref name="modelDriven"/>  
                   修改下面的这些文件类型值,就可以限制上传文件的类型了  
                <interceptor-ref name="fileUpload">  
                  <param name="allowedTypes">  
                     image/png,image/gif,image/jpeg,text/plain  
                  </param>  
                </interceptor-ref>
 
  上面配置的是上传文件类型的限制,其实共有两个参数 
maximumSize (可选) - 这个拦截器允许的上传到action中的文件最大长度(以byte为单位).  
                                                     注意这个参数和在webwork.properties中定义的属性没有关系,默认2MB 
 
allowedTypes (可选) - 以逗号分割的contentType类型列表(例如text/html), 
这些列表是这个拦截器允许的可以传到action中的contentType.如果没有指定就是允许任何上传类型.    
            
                 
                 
              
 <interceptor-ref name="checkbox"/>  
                <interceptor-ref name="staticParams"/>  
                <interceptor-ref name="actionMappingParams"/>  
                <interceptor-ref name="params">  
                  <param name="excludeParams">dojo\..*,^struts\..*</param>  
                </interceptor-ref>  
                <interceptor-ref name="conversionError"/>  
                <interceptor-ref name="validation">  
                    <param name="excludeMethods">input,back,cancel,browse</param>  
                </interceptor-ref>  
                <interceptor-ref name="workflow">  
                    <param name="excludeMethods">input,back,cancel,browse</param>  
                </interceptor-ref>  
                  Token,防止重复提交    
                <interceptor-ref name="token"/>  
  
            </interceptor-stack>  
</interceptors></span></span> 

那么具体想添加什么类型就可以在这个配置文件中 <interceptor-ref name="fileUpload">的内容里进行自定义了
现在为止,开发中可能用到的类型大致有如下这么多种,也就是mime类型

Java代码 
<span style="font-size: large;">application/vnd.lotus-1-2-3  
3gp video/3gpp  
aab application/x-authoware-bin  
aam application/x-authoware-map  
aas application/x-authoware-seg  
ai application/postscript  
aif audio/x-aiff  
aifc audio/x-aiff  
aiff audio/x-aiff  
als audio/X-Alpha5  
amc application/x-mpeg  
ani application/octet-stream  
asc text/plain  
asd application/astound  
asf video/x-ms-asf  
asn application/astound  
asp application/x-asap  
asx video/x-ms-asf  
au audio/basic  
avb application/octet-stream  
avi video/x-msvideo  
awb audio/amr-wb  
bcpio application/x-bcpio  
bin application/octet-stream  
bld application/bld  
bld2 application/bld2  
bmp application/x-MS-bmp  
bpk application/octet-stream  
bz2 application/x-bzip2  
cal image/x-cals  
ccn application/x-cnc  
cco application/x-cocoa  
cdf application/x-netcdf  
cgi magnus-internal/cgi  
chat application/x-chat  
class application/octet-stream  
clp application/x-msclip  
cmx application/x-cmx  
co application/x-cult3d-object  
cod image/cis-cod  
cpio application/x-cpio  
cpt application/mac-compactpro  
crd application/x-mscardfile  
csh application/x-csh  
csm chemical/x-csml  
csml chemical/x-csml  
css text/css  
cur application/octet-stream  
dcm x-lml/x-evm  
dcr application/x-director  
dcx image/x-dcx  
dhtml text/html  
dir application/x-director  
dll application/octet-stream  
dmg application/octet-stream  
dms application/octet-stream  
doc application/msword  
dot application/x-dot  
dvi application/x-dvi  
dwf drawing/x-dwf  
dwg application/x-autocad  
dxf application/x-autocad  
dxr application/x-director  
ebk application/x-expandedbook  
emb chemical/x-embl-dl-nucleotide  
embl chemical/x-embl-dl-nucleotide  
eps application/postscript  
eri image/x-eri  
es audio/echospeech  
esl audio/echospeech  
etc application/x-earthtime  
etx text/x-setext  
evm x-lml/x-evm  
evy application/x-envoy  
exe application/octet-stream  
fh4 image/x-freehand  
fh5 image/x-freehand  
fhc image/x-freehand  
fif image/fif  
fm application/x-maker  
fpx image/x-fpx  
fvi video/isivideo  
gau chemical/x-gaussian-input  
gca application/x-gca-compressed  
gdb x-lml/x-gdb  
gif image/gif  
gps application/x-gps  
gtar application/x-gtar  
gz application/x-gzip  
hdf application/x-hdf  
hdm text/x-hdml  
hdml text/x-hdml  
hlp application/winhlp  
hqx application/mac-binhex40  
htm text/html  
html text/html  
hts text/html  
ice x-conference/x-cooltalk  
ico application/octet-stream  
ief image/ief  
ifm image/gif  
ifs image/ifs  
imy audio/melody  
ins application/x-NET-Install  
ips application/x-ipscript  
ipx application/x-ipix  
it audio/x-mod  
itz audio/x-mod  
ivr i-world/i-vrml  
j2k image/j2k  
jad text/vnd.sun.j2me.app-descriptor  
jam application/x-jam  
jar application/java-archive  
jnlp application/x-java-jnlp-file  
jpe image/jpeg  
jpeg image/jpeg  
jpg image/jpeg  
jpz image/jpeg  
js application/x-javascript  
jwc application/jwc  
kjx application/x-kjx  
lak x-lml/x-lak  
latex application/x-latex  
lcc application/fastman  
lcl application/x-digitalloca  
lcr application/x-digitalloca  
lgh application/lgh  
lha application/octet-stream  
lml x-lml/x-lml  
lmlpack x-lml/x-lmlpack  
lsf video/x-ms-asf  
lsx video/x-ms-asf  
lzh application/x-lzh  
m13 application/x-msmediaview  
m14 application/x-msmediaview  
m15 audio/x-mod  
m3u audio/x-mpegurl  
m3url audio/x-mpegurl  
ma1 audio/ma1  
ma2 audio/ma2  
ma3 audio/ma3  
ma5 audio/ma5  
man application/x-troff-man  
map magnus-internal/imagemap  
mbd application/mbedlet  
mct application/x-mascot  
mdb application/x-msaccess  
mdz audio/x-mod  
me application/x-troff-me  
mel text/x-vmel  
mi application/x-mif  
mid audio/midi  
midi audio/midi  
mif application/x-mif  
mil image/x-cals  
mio audio/x-mio  
mmf application/x-skt-lbs  
mng video/x-mng  
mny application/x-msmoney  
moc application/x-mocha  
mocha application/x-mocha  
mod audio/x-mod  
mof application/x-yumekara  
mol chemical/x-mdl-molfile  
mop chemical/x-mopac-input  
mov video/quicktime  
movie video/x-sgi-movie  
mp2 audio/x-mpeg  
mp3 audio/x-mpeg  
mp4 video/mp4  
mpc application/vnd.mpohun.certificate  
mpe video/mpeg  
mpeg video/mpeg  
mpg video/mpeg  
mpg4 video/mp4  
mpga audio/mpeg  
mpn application/vnd.mophun.application  
mpp application/vnd.ms-project  
mps application/x-mapserver  
mrl text/x-mrml  
mrm application/x-mrm  
ms application/x-troff-ms  
mts application/metastream  
mtx application/metastream  
mtz application/metastream  
mzv application/metastream  
nar application/zip  
nbmp image/nbmp  
nc application/x-netcdf  
ndb x-lml/x-ndb  
ndwn application/ndwn  
nif application/x-nif  
nmz application/x-scream  
nokia-op-logo image/vnd.nok-oplogo-color  
npx application/x-netfpx  
nsnd audio/nsnd  
nva application/x-neva1  
oda application/oda  
oom application/x-AtlasMate-Plugin  
pac audio/x-pac  
pae audio/x-epac  
pan application/x-pan  
pbm image/x-portable-bitmap  
pcx image/x-pcx  
pda image/x-pda  
pdb chemical/x-pdb  
pdf application/pdf  
pfr application/font-tdpfr  
pgm image/x-portable-graymap  
pict image/x-pict  
pm application/x-perl  
pmd application/x-pmd  
png image/png  
pnm image/x-portable-anymap  
pnz image/png  
pot application/vnd.ms-powerpoint  
ppm image/x-portable-pixmap  
pps application/vnd.ms-powerpoint  
ppt application/vnd.ms-powerpoint  
pqf application/x-cprplayer  
pqi application/cprplayer  
prc application/x-prc  
proxy application/x-ns-proxy-autoconfig  
ps application/postscript  
ptlk application/listenup  
pub application/x-mspublisher  
pvx video/x-pv-pvx  
qcp audio/vnd.qcelp  
qt video/quicktime  
qti image/x-quicktime  
qtif image/x-quicktime  
r3t text/vnd.rn-realtext3d  
ra audio/x-pn-realaudio  
ram audio/x-pn-realaudio  
rar application/x-rar-compressed  
ras image/x-cmu-raster  
rdf application/rdf+xml  
rf image/vnd.rn-realflash  
rgb image/x-rgb  
rlf application/x-richlink  
rm audio/x-pn-realaudio  
rmf audio/x-rmf  
rmm audio/x-pn-realaudio  
rmvb audio/x-pn-realaudio  
rnx application/vnd.rn-realplayer  
roff application/x-troff  
rp image/vnd.rn-realpix  
rpm audio/x-pn-realaudio-plugin  
rt text/vnd.rn-realtext  
rte x-lml/x-gps  
rtf application/rtf  
rtg application/metastream  
rtx text/richtext  
rv video/vnd.rn-realvideo  
rwc application/x-rogerwilco  
s3m audio/x-mod  
s3z audio/x-mod  
sca application/x-supercard  
scd application/x-msschedule  
sdf application/e-score  
sea application/x-stuffit  
sgm text/x-sgml  
sgml text/x-sgml  
sh application/x-sh  
shar application/x-shar  
shtml magnus-internal/parsed-html  
shw application/presentations  
si6 image/si6  
si7 image/vnd.stiwap.sis  
si9 image/vnd.lgtwap.sis  
sis application/vnd.symbian.install  
sit application/x-stuffit  
skd application/x-Koan  
skm application/x-Koan  
skp application/x-Koan  
skt application/x-Koan  
slc application/x-salsa  
smd audio/x-smd  
smi application/smil  
smil application/smil  
smp application/studiom  
smz audio/x-smd  
snd audio/basic  
spc text/x-speech  
spl application/futuresplash  
spr application/x-sprite  
sprite application/x-sprite  
spt application/x-spt  
src application/x-wais-source  
stk application/hyperstudio  
stm audio/x-mod  
sv4cpio application/x-sv4cpio  
sv4crc application/x-sv4crc  
svf image/vnd  
svg image/svg-xml  
svh image/svh  
svr x-world/x-svr  
swf application/x-shockwave-flash  
swfl application/x-shockwave-flash  
t application/x-troff  
tad application/octet-stream  
talk text/x-speech  
tar application/x-tar  
taz application/x-tar  
tbp application/x-timbuktu  
tbt application/x-timbuktu  
tcl application/x-tcl  
tex application/x-tex  
texi application/x-texinfo  
texinfo application/x-texinfo  
tgz application/x-tar  
thm application/vnd.eri.thm  
tif image/tiff  
tiff image/tiff  
tki application/x-tkined  
tkined application/x-tkined  
toc application/toc  
toy image/toy  
tr application/x-troff  
trk x-lml/x-gps  
trm application/x-msterminal  
tsi audio/tsplayer  
tsp application/dsptype  
tsv text/tab-separated-values  
tsv text/tab-separated-values  
ttf application/octet-stream  
ttz application/t-time  
txt text/plain  
ult audio/x-mod  
ustar application/x-ustar  
uu application/x-uuencode  
uue application/x-uuencode  
vcd application/x-cdlink  
vcf text/x-vcard  
vdo video/vdo  
vib audio/vib  
viv video/vivo  
vivo video/vivo  
vmd application/vocaltec-media-desc  
vmf application/vocaltec-media-file  
vmi application/x-dreamcast-vms-info  
vms application/x-dreamcast-vms  
vox audio/voxware  
vqe audio/x-twinvq-plugin  
vqf audio/x-twinvq  
vql audio/x-twinvq  
vre x-world/x-vream  
vrml x-world/x-vrml  
vrt x-world/x-vrt  
vrw x-world/x-vream  
vts workbook/formulaone  
wav audio/x-wav  
wax audio/x-ms-wax  
wbmp image/vnd.wap.wbmp  
web application/vnd.xara  
wi image/wavelet  
wis application/x-InstallShield  
wm video/x-ms-wm  
wma audio/x-ms-wma  
wmd application/x-ms-wmd  
wmf application/x-msmetafile  
wml text/vnd.wap.wml  
wmlc application/vnd.wap.wmlc  
wmls text/vnd.wap.wmlscript  
wmlsc application/vnd.wap.wmlscriptc  
wmlscript text/vnd.wap.wmlscript  
wmv audio/x-ms-wmv  
wmx video/x-ms-wmx  
wmz application/x-ms-wmz  
wpng image/x-up-wpng  
wpt x-lml/x-gps  
wri application/x-mswrite  
wrl x-world/x-vrml  
wrz x-world/x-vrml  
ws text/vnd.wap.wmlscript  
wsc application/vnd.wap.wmlscriptc  
wv video/wavelet  
wvx video/x-ms-wvx  
wxl application/x-wxl  
x-gzip application/x-gzip  
xar application/vnd.xara  
xbm image/x-xbitmap  
xdm application/x-xdma  
xdma application/x-xdma  
xdw application/vnd.fujixerox.docuworks  
xht application/xhtml+xml  
xhtm application/xhtml+xml  
xhtml application/xhtml+xml  
xla application/vnd.ms-excel  
xlc application/vnd.ms-excel  
xll application/x-excel  
xlm application/vnd.ms-excel  
xls application/vnd.ms-excel  
xlt application/vnd.ms-excel  
xlw application/vnd.ms-excel  
xm audio/x-mod  
xml text/xml  
xmz audio/x-mod  
xpi application/x-xpinstall  
xpm image/x-xpixmap  
xsit text/xml  
xsl text/xml  
xul text/xul  
xwd image/x-xwindowdump  
xyz chemical/x-pdb  
yz1 application/x-yz1  
z application/x-compress  
zac application/x-zaurus-zac  
zip application/zip </span>  

关于office2007的几个常用的mime类型为

.dotx,application/vnd.openxmlformats-officedocument.wordprocessingml.template
.docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document
.xlsx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.pptx,application/vnd.openxmlformats-officedocument.presentationml.presentation

到此,文件类型被限制住了,那么当类型不对时,<result name="input">/index.jsp</result>这个就起作用了,意思
就是凡是上传遇到的类型不是规定类型的文件时,都会跳到index.jsp就是还是上传页面并显示错误信息,错误信息呢是利用了国际化配置在资源文件中的,页面上用 <s:fielderror name="up"></s:fielderror>来显示错误信息

假如我们限制类型为: image/png,image/gif,image/jpeg,text/plain,application/pdf,text/html,application/msword

那么上传的效果为
单独上传



上传后



如果我们不点击返回继续上传,而是点击浏览器上的后退按钮,那么这时TOKEN将起作用,提示下面的页面


如果我们上传一个不在限定类型内的文件的话,也会报错


上传后的结果


对于批量上传


上传后






猜你喜欢

转载自zengxiangshun.iteye.com/blog/1098254