FileUpload解析

实现原理

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

猜你喜欢

转载自yuebishuhui-sina-com.iteye.com/blog/2220269