当前位置: 首页 > 图文教程 > Java技术 > Web框架 > Web框架:Struts2高级文件上传

Web框架
Struts开发过程中的异常处理机制
ServletContext与ServletConfig分析
使用Ajax的挑战
Web程序从Struts向Stripes框架的移植
Shale不是Struts
Web框架:基于Ajax的应用程序架构汇总
Web框架:使用Ajax技术开发Web应用程序
Web框架:简单理解Hibernate三种状态的概念及互相转化
Web框架:浅谈Struts2中拦截器应用
Web框架:Struts2中的Action
Web框架:Struts2高级文件上传
Web框架:小编谈嵌入XFire服务介绍及实现
Web框架:DWR中signatures标签的使用
WEB框架:小编总结Struts2的经典输入校验
WEB框架:小编祥谈Struts2的数据标签中Action与Bean标签的使用
Web框架:小议struts2类型转换
Web框架:小编浅谈Struts2的pub-sub事件模型
Web框架:小编简述JSF
Web框架:Hibernate事务管理
Web框架:Struts高级特性(StrutsAdvancedFeature)验证

Web框架:Struts2高级文件上传


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 639 ::
收藏到网摘: n/a

当我们做文件上传的时候其实有挺多需要注意的地方,比如说文件上传的格式,

大部分的时候有些文件我们是不允许用户上传的,比例.exe文件(可能有病毒)等。因此可以在Action中增加如下代码来实现文件的过滤:

public String execute() throws Exception{
   //
将允许上传文件类型的字符串以英文逗号(,)分解生字符串数组
   String filterResult = this.filterDocType(this.getAllowType().split(","));
   //
判断是否可以上传
   if(null != filterResult){
    //
不允许上传
    ActionContext.getContext().put("typeError", "
你要上传的文件类型不正确!");
    return filterResult;
   }

  
   //
以服务器的文件保存地址和原文件名建立上传文件输出流
   FileOutputStream fos = new FileOutputStream(getSavePath() + "/" + getUploadFileName());
   //
以上传文件建立一个文件上传输入流
   FileInputStream fis = new FileInputStream(getUpload());
   //
将上传的内容写入服务器
   byte[] buffer = new byte[1024];
   int len = 0;
   while((len = fis.read(buffer)) > 0){
    fos.write(buffer , 0 , len);
   }
   return this.SUCCESS;
  
}

/**
*
过滤文件
*
* @param
系统允许上传的所有文件类型
* @return
如果文件类型允许上传返回null,否则返回input字符串
*/
public String filterDocType(String[] types){
   //
取得上传文件的文件类型
   String fileType = this.getUploadContentType();
   //
遍历
   for(String type : types){
    if(type.equals(fileType)){
     return null;
    }
   }
   return this.INPUT;
}

private String allowType;
public String getAllowType() {
   return allowType;
}
public void setAllowType(String allowType) {
   this.allowType = allowType;
}

其中的allowType是我在struts.xml文件中配置的参数,Struts.xml文件中的内容如下:

<action name="upload" class="com.annlee.upload.UploadAction" >
        <param name="savePath">/</param>
       
<param name="allowType">image/bmp,image/gif,image/jpg</param>
            <result>/common/succ.jsp</result>
            <result name="input">/cos_fileupload/fileupload.jsp</result>
        </action>

在上传页面中添加以下一句,输出错误提示信息:${requestScope.typeError }

文件大小的过滤

实现文件大小的过滤,与实现文件类型的过滤方法基本相同,File属性有一个length()方法,该方法返回文件的大小。

拦截器实现文件过滤

Struts2本身提供了一个文件上传的拦截器,通过配置该拦截器可以更轻松地实现文件过滤。我们只需要在Action中配置该拦截器就可以了。当文件过滤失败后,会自动转向input逻辑视图,因此必须为该Action配置名为input的逻辑视图,除此之外还必须为配置defaultStack的拦截器的引用。配置文件如下:

<action name="upload" class="com.annlee.upload.UploadAction" >
        <!--
配置fileUpload的拦截器 -->
        <interceptor-ref name="fileUpload">
           <!--
配置允许上传的文件类型
-->
           <param name="allowedTypes">image/bmp,image/gif,image/jpg</param>
           <!--
配置允许上传的文件大小
-->
           <param name="maximumSize">2000000</param>
        </interceptor-ref>
        <interceptor-ref name="defaultStack"></interceptor-ref>

       
        <param name="savePath">/</param>
            <result>/common/succ.jsp</result>
            <result name="input">/cos_fileupload/fileupload.jsp</result>
        </action>

如果上传失败系统会返回到原来的页面,要在原来的页面上加上以下错误提示代码:

<s:fielderror />这样系统就会返回提示给用户,但是这时的提示是Struts2自带的提示,非常不友好,我们可以国际化资源里配置以下两项,我们的提示就会自动替换Struts2的提示,提示的关键字如下

struts.messages.error.file.too.large

struts.messages.error.content.type.not.allowed

此外,如果用户上传失败的原因不是因为以上两种还有另外的一个信息提示用户,它的关健字是:struts.messages.error.uploading,我们也应该替换这个提示信息。

其它说明:如果没有指定临时的保存文件夹,系统就会使用javax.servlet.context.tempdir路径,这个路径是Tomcatwork\Catalina\localhost\,我们应该设置自己的路径,这个配置的属性为struts.multipart.saveDir可以在struts.properties中配置,还有一个文件上传的属性:struts.multipart.maxSize设置整个表单请求内容的最大字节数。

相信文章写到这里,大家都应该了解了文件是怎么过滤的,如果大家有什么不明白的话,欢迎到软晨学习网论坛里发帖讨论。