实现原理
Struts 2是通过Commons FileUpload文件上传。CommonsFileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦 截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。
fileUpload拦截器必须在defaultStack(默认)拦截器前面配置,Struts2会由上到下执行拦截器。
<!--配置fileUpload的拦截器-->
<interceptor-refname="fileUpload">
<!--配置允许上传的文件类型-->
<paramname="allowedTypes">image/bmp,image/png,image/gif,image/jpeg
</param>
</interceptor-ref>
<interceptor-refname="defaultStack"/>
allowedTypes指定上传的文件类型,但类型不符只会在控制台输出警告语句,程序不会报错。
maximumSize指定上传的单个文件大小,但文件超出大小只会在控制台输出警告语句,程序不会报错。注意不能写成1024*1024*5的形式。
struts.xml里进行以下设置:
<constant name="struts.i18n.encoding" value="GBK"/>国际化资源文件编码
<constant name="struts.multipart.saveDir" val ="/temp"/>,这句指定了上传文件的临时存放目录
<constant name="struts.multipart.maxSize" val ="10240000"/>,Struts2的文件上传功能默认最大只能上传2M大小。这句重新指定了上传文件的总大小的最大限制,单位是字节。
//相关部分代码
页面文件中,将表单的提交方式设为POST,然后将enctype设为multipart/form-data
public class FileUploadAction extends ActionSupport
int BUFFER_SIZE = 1024*32;
File imageFile=newFile(ServletActionContext.getServletContext().getRealPath("/UploadImages")+"/"+imageFileName);
copy(myFile, imageFile);//或使用IOUtils.copy(in, out);
try{
InputStreamin=null;
OutputStream out=null;
try{
in=newBufferedInputStream(newFileInputStream(src), BUFFER_SIZE);
out=newBufferedOutputStream(newFileOutputStream(dst), BUFFER_SIZE);
byte[]buffer=newbyte[BUFFER_SIZE];
while(in.read(buffer)>0){
out.write(buffer);
}
}finally{
if(null!=in){
in.close();
}
if(null!=out){
out.close();
}
}
}catch(Exception e){
e.printStackTrace();
}
对应的国际化资源文件
大多数情况下,我们都需要自定义和国际化这些信息。
通过在全局的国际资源文件中加入
“struts.messages.error.content.type.not.allowed=The file you uploaded is not a image” //文件类型
“struts.messages.error.file.too.large= too large " //上传文件的大小
“struts.messages.error.uploading=”//用提示一般的上传出错信息。
allowedExtensionsSet这是设置允许上传文件的后缀,多个类型以逗号“,”隔开,如果某个文件的后缀没在这个设置之类,则会产生一个错 误保存到Action中,错误的i18n的的key为 struts.messages.error.file.extension.not.allowed