- 浏览: 3009099 次
- 性别:
- 来自: 河南
文章分类
- 全部博客 (340)
- Java综合 (26)
- 程序人生 (53)
- RIA-ExtJS专栏 (18)
- RIA-mxGraph专栏 (4)
- RIA-Flex4专栏 (43)
- 框架-Spring专栏 (16)
- 框架-持久化专栏 (22)
- 框架-Struts2专栏 (11)
- 框架-Struts专栏 (12)
- SQL/NOSQL (12)
- 报表/图表 (2)
- 工作流 (5)
- XML专栏 (4)
- 日常报错解决方案 (5)
- Web前端-综合 (12)
- Web/JSP (14)
- Web前端-ajax专栏 (14)
- Web前端-JQuery专栏 (9)
- IDE技巧 (6)
- FILE/IO (14)
- 远程服务调用 (2)
- SSO单点登录 (2)
- 资源分享 (22)
- 云计算 (1)
- 项目管理 (3)
- php专栏 (1)
- Python专栏 (2)
- Linux (1)
- 缓存系统 (1)
- 队列服务器 (1)
- 网络编程 (0)
- Node.js (1)
最新评论
-
hui1989106a:
我的也不能解压,360和好压都试了,都不行
《Spring in Action》完整中文版分享下载 -
temotemo:
这些example有些过时了,官方建议使用HBase-1.0 ...
Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询 -
zy8102:
非常感谢~
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载 -
zy8102:
重命名了一下搞定了
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载 -
zy8102:
为什么下载以后老解压不了呢?
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载
自接触这么多种技术的上传来看,还是Struts2的上传最好用,虽然之前有篇文章已经总结了几乎我接触到的所有类型的上传,但Struts2方面感觉讲的还是不够细致。
本文就单文件上传和批量文件上传来进行讲解
具体示例
首页上传页面
<%@ 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>
单文件上传的Action
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;
}
}
多文件上传的Action
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;
}
}
}
针对上面两个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
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
msg_en_US.properties
struts.messages.error.content.type.not.allowed=upload file contenttype is invalidate
src/struts.xml
<?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>
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中的
<interceptors>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="token"/>
</interceptor-stack>
</interceptors>
替换成下面的
<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>
那么具体想添加什么类型就可以在这个配置文件中 <interceptor-ref name="fileUpload">的内容里进行自定义了
现在为止,开发中可能用到的类型大致有如下这么多种,也就是mime类型
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
关于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将起作用,提示下面的页面
如果我们上传一个不在限定类型内的文件的话,也会报错
上传后的结果
对于批量上传
上传后
评论
发表评论
-
struts2中关于ActionMessage在redirect传递时丢失问题的解决方案
2011-01-24 09:32 4294首先来看一段ACTION代码 @ParentPacka ... -
Struts2温习(9)--国际化的应用
2010-11-16 15:11 15071. Java对国际化的支持: Java内部使用unicode ... -
Struts2温习(8)--表单验证的两种方式
2010-11-16 10:32 48631. Struts2中的输入校验 2. 编码方式校验 1) ... -
Struts温习(7)--自定义类型转换器
2010-11-16 10:08 3224一、概述 在B/S应用中,将字符串请求参数转换 ... -
Struts2温习(6)--拦截器(Inteceptor)的使用
2010-11-15 21:36 2230Interceptor(以下译为拦截器)是Struts ... -
Struts2温习(5)--OGNL的使用
2010-11-15 20:18 4057要谈OGNL在Struts2中的应用,首先得明白OGNL到底是 ... -
Struts2温习(4)--基于注解方式Action配置
2010-11-15 19:37 22820还是已登录来说明下这个Action的配置,这里要说的Actio ... -
Struts2温习(3)--ActionSuppot的使用
2010-11-15 17:29 2315之前在第一个示例中,使用到的Acrtion是没有继承任何方法的 ... -
Struts2温习(2)--工作原理图解
2010-11-15 10:11 1960就上篇文章的第一个完整的登录示例,我们本节来讲解下Struts ... -
Struts2温习(1)--最基本的示例
2010-11-15 10:01 3059有关Struts1的知识大部分都已经温习完毕,今天开始转向St ...
相关推荐
赠送Maven依赖信息文件:struts2-json-plugin-2.3.24.pom; 包含翻译后的API文档:struts2-json-plugin-2.3.24-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.struts:struts2-json-plugin:2.3.24; ...
struts2-core-2.0.1.jar, struts2-core-2.0.11.1.jar, struts2-core-2.0.11.2.jar, struts2-core-2.0.11.jar, struts2-core-2.0.12.jar, struts2-core-2.0.14.jar, struts2-core-2.0.5.jar, struts2-core-2.0.6.jar,...
struts2-spring-plugin-2.3.15.2.jar ; struts2-json-plugin-2.3.16.3.jarstruts2-spring-plugin-2.3.15.2.jar ; struts2-json-plugin-2.3.16.3.jar
struts2-ssl-plugin-1.2.1.jar
struts2-json-plugin,Struts JSON插件
`struts2-json-plugin-2.1.8.1.jar` 则是Struts 2框架的一个插件,主要用于增强Struts 2对JSON的支持。Struts 2是一款非常流行的MVC(Model-View-Controller)框架,用于构建企业级的Java Web应用程序。这个插件允许...
struts2-dojo-plugin-2.3.4 jar 日期控件的jar包 需要的自行下载
Struts2-Spring-Plugin-2.3.4.jar 是一个专门为 Struts 2 框架和 Spring 框架整合而设计的插件,主要用于处理 Struts 2 和 Spring 之间的集成问题。在Java Web开发中,这两个框架经常一起使用,Spring 提供了依赖...
struts2-convention-plugin-2.3.15.1.jar
struts2-convention-plugin-2.3.24.1
struts.xml文件中新增以下内容: <!-- 为修复struts2 s2-016、s2-017漏洞,重写DefaultActionMapper --> <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="myDefaultActionMapper" class=...
在实际开发中,为了使用这个插件,你需要将`struts2-json-plugin-2.3.8.jar`文件放入项目的类路径(classpath)下,然后在Struts2的配置文件(通常为struts.xml)中启用JSON插件。在Action类中,定义返回JSON数据的...
struts2-struts1-plugin-2.1.6.jar
该漏洞是由于 Struts2 中的 MultiPartRequestWrapper 类中的一个错误导致的,该错误可能会导致攻击者可以上传恶意文件,进而导致服务器崩溃或数据泄露。 修补方法 为了修复 S2-045 漏洞,我们可以采取以下步骤: 1...
默认的struts2-config-browser-plugin包中的ftl文件include标签路径用的相对路径,会找到包内的include文件,将包内ftl里include的路径改成的/开头的全路径。
struts2-core-2.5.18.jar包下载,支持struts2的类库下载
struts2-core-2.5.10.jar ,struts核心包,struts2-core-2.5.10.jar
struts2-jquery-plugin-3.1.0.jar
struts2-jfreechart-plugin-2.1.8.1.jar
struts2-convention-plugin-2.1.6.jar