`
flustar
  • 浏览: 96744 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts2中使用Common-FileUpload实现文件上传

阅读更多
在web应用中,文件上传似乎是很常见的,但是采用传统的方法不但复杂而且难以控制,需要写很多代码,像控制文件大小、文件类型的过滤、存放目录等等。这些复杂的问题在Struts2中已经不存在了,struts2默认使用common-fileupload实现文件的上传。在struts.properties中我们可以看到:struts.multipart.parser=Jakarta 。下面我们就以Common-FileUpload来实现文件上传。

首先,把commons-fileupload.jar和commons-io.jar拷贝到classpath路径下。

建立一个上传文件的页面,upload.jsp。

<%@ page contentType="text/html; charset=utf-8" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns ="http://www.w3.org/1999/xhtml" >
<head>
    <title> Struts 2 File Upload </title >
</head >
<body >
    <div style="color.red">
        <s:fielderror />
    </div>
    <s:form action ="upload" method ="post" enctype ="multipart/form-data" >
        <s:textfield name ="title" label ="文件标题" />
        <s:file name ="upload" label ="选择文件" />     
        <s:submit value="上传" />
    </s:form>
</body >
</html >


上传成功后的succ.jsp

<%@ page contentType="text/html;charset=utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns ="http://www.w3.org/1999/xhtml" >
<head>
    <title> Struts 2 File Upload </title >
</head>
<body>
    <div style ="padding: 3px; border: solid 1px #cccccc; text-align: center" >
        <img src ='upload/<s:property value ="uploadFileName" /> ' />
        <br />
        <s:property value ="title" />
    </div >
</body >
</html >


然后编写UploadAction.java

/** *//**
*
* @author <a href="mailto:flustar2008@163.com">flustar</a>
* @version 1.0
* Creation date: Feb 15, 2008 10:24:36 PM
*/
package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport{
    private static final long serialVersionUID = -7887613751080170362L;
    private String title;//设置上传文件的标题
    private File upload;//封装上传文件
    private String uploadFileName;//设置上传文件的文件名
    private String uploadContentType;//上传文件的类型
    private String savePath;//上传文件的保存路径
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public File getUpload() {
        return upload;
    }
    public void setUpload(File upload) {
        this.upload = upload;
    }
   
    public String getUploadFileName() {
        return uploadFileName;
    }
    public void setUploadFileName(String uploadFileName) {
        this.uploadFileName = uploadFileName;
    }
    public String getUploadContentType() {
        return uploadContentType;
    }
    public void setUploadContentType(String uploadContentType) {
        this.uploadContentType = uploadContentType;
    }
    public String getSavePath() {
        System.out.println(ServletActionContext.getServletContext().getRealPath(savePath));
        return ServletActionContext.getServletContext().getRealPath(savePath);
    }
    public void setSavePath(String savePath) {
        this.savePath = savePath;
        System.out.println("savePath: "+savePath);
    }
    public String execute()throws Exception{
        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 SUCCESS;
    }
}


编写struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="blog" extends="struts-default">
       
<action name="upload" class="test.UploadAction">
            <!-- Struts2内置的文件上传拦截器 -->
            <interceptor-ref name="fileUpload">
                <param name="allowedTypes">image/bmp,image/x-png,image/gif,image/pjpeg</param>
                <param name="maximumSize">2048000</param>
            </interceptor-ref>
            <interceptor-ref name="defaultStack" />
            <param name="savePath">/upload</param>
            <result>/succ.jsp</result>
            <result name="input">/upload.jsp</result>
        </action>
       
</package>
       
</struts>


编写struts.properties


struts.custom.i18n.resources=mess

struts.multipart.parser=jakarta

struts.multipart.maxSize=10000000



编写国际化的资源文件mess.properties


struts.messages.error.content.type.not.allowed="Thetypeisnotbeallowed!"

struts.messages.error.file.too.large="Thefileistoolarge!"

struts.messages.error.uploading="unknownerror"



在这里我没有把调试的过程写出来,这完全没必要,网上已经有很多这方面的例子了,但是网上好多例子都有一个通病,那就是错误的信息实在是太多了,都是搜索引擎惹得祸。按照上面的步骤来做,很难成功!我按照上面的步骤来操作,发现两个比较普遍的错误:

1) 不能上传png和jpg类型的图片。解决办法可以参考上面的struts.xml。

2) 上传过大的文件没有提示信息,而是直接抛出下面的异常:

   org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (2359629) exceeds the configured maximum (2097152)

为什么会出现这个错误?刚开始我还以为是Struts2的一个bug,于是我就开始研究是struts2内置的fileUpload拦截器,我研究了FileUploadInterceptor.java的源代码并调试了半天依然不能解决这个问题,我都被它快折磨死了。最后我想起了在我们编写struts.properties中有这么一句struts.multipart.parser=Jakarta,实际上这一句也可以不写因为这是struts2为了支持文件上传默认的。那么这个Jakarta到底是什么东西呢?实际上Jakarta实际上就是org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest类。打开JakartaMultiPartRequest.java的源代码你会发现这个类实现了MultiPartRequest接口,在这个类封装了对底层ServletFileUpload的操作,由于common-fileupload组件默认最大支持上传文件的大小为2M,当我们上传大于2M的文件时,就会出现上面的异常。是这个异常的发生导致了fileUpload拦截器没有机会执行,所以我看到的是页面没有任何变化,也没有任何提示信息,只是在控制台打印出了上面的异常。解决的办法在struts.properties文件中把struts.multipart.maxSize设置成一个比较大的值,也是就说maxSize远远要大于可能上传文件的大小和fileUpload拦截器中maxinumSize的值,可参见上面的struts.xml和struts.properties文件。
分享到:
评论
6 楼 lxtkong-029 2009-11-05  
谢谢,郁闷了半天了
5 楼 fox_zhang 2009-02-28  
    代码 还有一个很出心的地方    仔细看看!
4 楼 shz2008bj 2009-02-11  
saint.deng 写道

我现在用这个ServletActionContext.getServletContext()的时候碰到一个问题,我引入的包是struts2.0-core-2.0.9的包,但是我写代码的时候他总是找不到getServletContext()这个方法。我觉得很奇怪,但我看他的source的时候是有这个方法的,不知道有没有碰到过类似的问题!!!!

把j2ee的jar包加入到工程就行了
3 楼 saint.deng 2009-02-09  
我现在用这个ServletActionContext.getServletContext()的时候碰到一个问题,我引入的包是struts2.0-core-2.0.9的包,但是我写代码的时候他总是找不到getServletContext()这个方法。我觉得很奇怪,但我看他的source的时候是有这个方法的,不知道有没有碰到过类似的问题!!!!
2 楼 tvmovie 2008-11-14  
是噢,我也碰到,非常感谢你啊
1 楼 ziscloud 2008-11-09  
哈哈,太谢谢你来!

我也遇到直接抛出异常的情况,多谢!

相关推荐

    利用Common-fileupload封装的文件上传组件...附上源码.

    总的来说,利用`Common-fileupload`,开发者可以方便地在Java Web应用中实现文件上传功能。这个库提供了多部分解析器,可以处理大文件的分块上传,避免一次性加载整个文件到内存中。它还支持设置上传限制,防止恶意...

    两篇网文:拦截器 Common-FileUpload

    在Struts2框架中结合使用拦截器和Common-FileUpload,可以创建一个安全且高效的文件上传系统。例如,你可以创建一个拦截器来验证上传文件的大小,防止过大文件导致服务器资源耗尽。同时,你还可以在Action中利用...

    Common-FileUpload与struts2文件上传

    在IT行业中,文件上传是...开发者可以通过Struts2的配置和Action类设计,结合Commons FileUpload的多部分解析能力,实现高效且安全的文件上传功能。同时,理解并掌握这两者的使用有助于提高Java Web开发的效率和质量。

    Common-FileUpload带进度条文件上传

    总的来说,"Common-FileUpload带进度条文件上传"是一个旨在提升用户体验的功能,通过提供文件上传进度的可视化反馈,使用户在等待上传过程中有更明确的感知。在实际开发中,理解这些知识点并正确应用,可以确保文件...

    commons-fileupload-1.3.3.jar和commons-io-2.6.jar

    总的来说,`commons-fileupload-1.3.3.jar`和`commons-io-2.6.jar`是Java开发中不可或缺的工具,它们大大简化了文件上传的实现,同时也提供了良好的错误处理和资源管理机制,使得文件上传操作变得更加可靠和高效。...

    struts中使用Common-fileUpload.的几篇网络文章

    通过上述步骤,你可以在Struts 2应用中成功实现文件上传功能,利用Commons FileUpload库的强大功能来处理上传的文件。以上内容涵盖了从创建上传表单到处理上传请求、验证和存储文件的关键知识点。希望这些信息能对你...

    java使用common-fileupload实现文件上传

    下面我们将详细介绍如何使用Commons FileUpload在Java中实现文件上传。 首先,你需要在项目中引入Commons FileUpload和Commons IO两个依赖库。这两个库可以从Apache官方网站下载,或者如果你使用的是Struts框架,...

    easyUi+jquery+common-file-upload +struts2带进度条的文件上传DEMO

    基于eclipse + easyUi1.2.6+common-fileupload + struts2实现带进度条的文件上传DEMO,具体效果跟思路可见我的博客:http://blog.csdn.net/jun55xiu/article/details/22042279

    dom4j、common-fileupload、hibernate、jdom、log4j、proxool、spring、struts、webwork等工具、框架源码

    2. **Common-FileUpload**: 这是Apache Commons的一个模块,用于处理HTTP协议中的多部分文件上传请求。它简化了在Web应用程序中接收和处理大文件上传的过程,支持分块上传和错误处理。 3. **Hibernate**: Hibernate...

    Struts2文件上传

    2. **添加依赖库**:为了使项目能够使用Struts2框架以及文件上传功能,需要在项目的lib目录下添加Struts2的JAR包,以及Common-FileUpload或COS框架的相关JAR包,确保所有必要的依赖都已就绪。 3. **界面设计**:...

    struts2实现文件上传

    ### Struts2 实现文件上传知识点详解 #### 一、Struts2文件上传概述 Struts2 是一个基于 Java 的开源框架,它提供了一种灵活的方式来构建 Web 应用程序。Struts2 提供了许多内置的功能,其中包括文件上传功能。在...

    common fileupload上传组件包

    "Common Fileupload上传组件包"是一个专用于处理Web应用程序中文件上传功能的工具包。这个包包含两个核心组件:`commons-io-1.4.jar`和`commons-fileupload-1.2.1.jar`。这两个组件在实现文件上传过程中扮演着至关...

Global site tag (gtag.js) - Google Analytics