欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2023-12-25 21:55:21
...
自接触这么多种技术的上传来看,还是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将起作用,提示下面的页面


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


上传后的结果


对于批量上传


上传后






上一篇:

下一篇: