`

Struts2上传

阅读更多

(一)预备工作:
首先, 建立struts2的工作環境,这里就不说了。
然后把
commons-fileupload.jar commons-io.jar拷贝到 classpath路径下。

(二)建立一个上传文件的页面 upload.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"%> 
<%@taglib prefix="s" uri="/struts-tags"%> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=GBK" /> 
<title>使用List上传多个文件</title> 
</head> 
<body> 
<s:fielderror/> 
<form action="upload.action" method="post" enctype="multipart/form-data"> 
<table> 
<tbody> 
文件标题:<input type="text" name="title" /><br> 
选择第一个文件:<input type="file" name="upload" /><br> 
选择第二个文件:<input type="file" name="upload" /><br> 
选择第三个文件:<input type="file" name="upload" /><br> 
<input value="上传" type="submit" /> 
</tbody> 
</table> 
</form> 
</body> </html> 

 
 

(三)上传类:

基本原理:

    上传文件是由FileUploadInterceptor实现的,基本原理是这样的,FileUploadInterceptor会从上传的数据中解析出上传的文件名称,文件类型和文件内容,调用Action相应的方法进行设置。

    struts2上传实现的关键:假定上传表单中File控件的名称是upload,则Action必须实现如下三个属性来封装文件域:

List upload;                          //封裝tpye=file的文件域的文件内容 
String uploadContentType;  //封装文件类型 
String uploadFileName;        //封装文件的名字

 如果是多個文件上傳,則:

private List<File> upload;                          //用List封裝多个tpye=file的文件域的文件内容 
private List<String> uploadContentType;  //List封装多个文件类型 
private List<String> uploadFileName;        //List封装多个文件的名字 

 

java代码如下:
package lee;
import com.opensymphony.xwork2.Action;
import org.apache.struts2.ServletActionContext;
import java.util.*;
import java.io.*;
import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport
{
    /**
     *
     */
    private static final long serialVersionUID = -9196711870948215911L;
    private String title; 
   
private List<File> upload;  //用List封裝多个tpye=file的文件域的文件内容
    private List<String> uploadContentType; 
//List封装多个文件类型
    private List<String> uploadFileName;
     //List封装多个文件的名字
  //接受依赖注入的属性
    private String savePath;
  //接受依赖注入的方法
    public void setSavePath(String value){
        this.savePath = value;
    }
    @SuppressWarnings("deprecation")
    private String getSavePath() throws Exception {
        return ServletActionContext.getRequest().getRealPath(savePath);
    }

    @Override
    public String execute() throws Exception
    {
        System.out.println("文件lujing::"+ getUpload());
        List<File> files = getUpload();
        for (int i = 0 ; i < files.size() ; i++)
        {
            //以服务器的文件保存地址和原文件名建立上传文件输出流  
            FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName().get(i));
            FileInputStream fis = new FileInputStream(files.get(i));
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = fis.read(buffer)) > 0)
            {
                fos.write(buffer , 0 , len);
            }
        }
        return SUCCESS;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public void setUpload(List<File> upload) {
        this.upload = upload;
    }
    public void setUploadContentType(List<String> uploadContentType) {
        this.uploadContentType = uploadContentType;
    }
    public void setUploadFileName(List<String> uploadFileName) {
        this.uploadFileName = uploadFileName;
    }
    public String getTitle() {
        return (this.title);
    }
    public List<File> getUpload() {
        return (this.upload);
    }
    public List<String> getUploadContentType() {
        return (this.uploadContentType);
    }
    public List<String> getUploadFileName() {
        return (this.uploadFileName);
    }
}

 

 

(四)struts.xml
这个文件放在src的根目录中,编译后的位置就是在WEB-INF/classes里面,代码如下
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>

    <!--  上传文件的最大值 -->
    <constant name="struts.multipart.maxSize" value="100000000"></constant>
    <constant name="struts.custom.i18n.resources" value="messageResource"/>
    <!-- <constant name="struts.i18n.encoding" value="UTF-8"></constant>  -->
    <package name="tel" extends="struts-default">
    <!-- 上傳測試 -->
        <action name="upload" class="lee.UploadAction">
           <!-- struts2上傳文件的攔截器 -->
           <interceptor-ref name="fileUpload">
                <!-- 定义允许的上传文件的类型-->
                <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg,image/pjpeg</param>
                 <!--  上传文件的最大值,超過2M,這裡就失去了作用 -->
                <param name="maximumSize">2000000</param>
            </interceptor-ref>  
            <!-- 默認拦截器 -->
            <interceptor-ref name="defaultStack"/>   
            <!-- 動態參數:文件在服務器的保存路徑,相对路径 -->
            <param name="savePath">/upload</param>
            <!--  上傳出錯,頁面調轉到input -->
            <result name="input">/upload.jsp</result>
            <!-- 上傳成功,頁面調轉到  -->
            <result name="success">/succ.jsp</result>   
        </action>
    </package>
</struts>

(五)全局资源文件
#上傳格式不對的錯誤提示
struts.messages.error.content.type.not.allowed=上傳文件格式不對,請重新選擇!
#上傳超過最大限制的錯誤提示
struts.messages.error.file.too.large=上傳文件最大為20M,請重新選擇!
#上傳出現其他錯誤的提示
struts.messages.error.uploading=傳輸出錯,請重試!

 

分享到:
评论
2 楼 vera_sq 2010-01-21  
<interceptor-ref name="fileUpload">
			<param name="maximumSize">20000</param>
			<param name="allowedTypes">image/png,image/gif,image/jpeg,image/pjpeg</param>
		</interceptor-ref>

我的配置文件是这样写的,可是还是不能上传png格式的图片呢?
1 楼 xuganggogo 2009-06-03  
在这里我没有把调试的过程写出来,这完全没必要,网上已经有很多这方面的例子了,但是网上好多例子都有一个通病,那就是错误的信息实在是太多了,都是搜索引擎惹得祸。按照上面的步骤来做,很难成功!我按照上面的步骤来操作,发现两个比较普遍的错误:

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文件。

相关推荐

    struts2上传文件源代码

    在这个“struts2上传文件源代码”中,我们将深入探讨Struts2如何实现文件上传功能,以及涉及到的相关知识点。 首先,文件上传是Web应用中常见的功能,它允许用户从本地计算机选择文件并将其发送到服务器。在Struts2...

    struts2上传下载项目

    在"struts2上传下载项目"中,我们可以深入理解如何利用Struts2实现文件的上传与下载功能。 首先,上传功能在Web应用中十分常见,比如用户在注册时上传头像,或者提交文档等。在Struts2中,我们主要借助`struts2-...

    struts2上传和下载文件详细源码

    在这个"struts2上传和下载文件详细源码"中,我们可以深入理解Struts2如何处理文件上传和下载操作。 1. 文件上传: 在Struts2中,文件上传主要依赖于Apache的Commons FileUpload库。首先,需要在struts.xml配置文件...

    Uploadify结合Struts2上传demo

    本教程将围绕"Uploadify结合Struts2上传demo"这一主题,详细介绍如何在Struts2框架下集成Uploadify实现文件上传功能。 首先,我们需要在项目中引入Uploadify的相关资源。这通常包括JavaScript库(uploadify.js)和...

    struts2上传插件(中文编码冲突解决)

    解决Struts2上传时候使用UTF-8的冲突问题: * 重新包装了JakartaMultiPartRequest提供Chartset的设置方法。 * 可以通过配置方式对MultiPartRequest中的内容进行编码设定,请在Struts.xml中配置添加struts.multipart...

    struts2上传图片到Oracle

    在"struts2上传图片到Oracle"这个场景中,我们将探讨如何使用Struts2框架实现文件上传,以及如何将这些上传的图片存储到Oracle数据库中。 首先,让我们了解文件上传的基本流程。在Struts2中,我们通常会创建一个...

    struts2 文件上传

    struts2 文件上传 struts2上传标签file fileuploadstruts2 文件上传 struts2上传标签file fileuploadstruts2 文件上传 struts2上传标签file fileupload

    struts2 上传图片显示

    在本场景中,我们关注的是如何使用Struts2来实现图片上传并显示的功能,同时生成缩略图。 首先,我们需要在Struts2配置文件(通常为struts.xml)中定义一个Action类,该类负责处理图片上传请求。这个Action类应该有...

    struts2上传文件及拦截器

    struts2上传单个文件及多个文件,strus2拦截器的使用,里面有个user用户,先执行user.jsp即登陆,可以执行上传文件的操作,反之,不能,有个exit.jsp,退出之后不能执行。里面含有jar文件,导入myeclipse可以执行...

    struts2上传图片

    在"struts2上传图片"这个场景下,我们将深入探讨如何在Struts2框架下实现用户上传图片的功能,并关注网站统计访问量以及防止重复提交的问题。 首先,上传图片是Web应用中常见的功能,它涉及到前端表单设计、后端...

    struts2 上传文件及打包下载zip

    在这个"struts2 上传文件及打包下载zip"的示例中,我们将探讨如何利用Struts2实现文件上传和下载功能。 首先,文件上传是Web应用程序中的常见需求。在Struts2中,我们可以使用`Struts2`提供的`CommonsFileUpload`...

    struts2上传文件进度条显示

    Struts2作为一款流行的Java Web框架,提供了丰富的功能来处理用户请求,包括文件上传。在Struts2中实现文件上传并展示进度条是一项常见的需求,它能提升用户体验,尤其是在处理大文件时。以下将详细解释如何在Struts...

    Jquery+struts2上传图片,制作进度条,以及Jquery+Json+Struts交互等示例

    Jquery+struts2上传图片,制作进度条等示例,还有Jquery+Json+Struts实现Ajax技术,还有图形处理技术等,虽然很少,但都有重点突出,由于我也是学习,所以代码不是很简洁,对想学习交流的朋友非常合适

    Struts2上传图片存数据库

    在本案例中,我们探讨的是如何利用Struts2框架处理文件上传,并将上传的图片以BLOB(Binary Large Object)类型存储在数据库中,同时提供下载功能。Hibernate则是一个对象关系映射(ORM)框架,它简化了数据库操作,...

    ckeditor+struts2上传图片

    2. **创建Struts2 Action**:在Struts2项目中创建一个Action类,比如`ImageUploadAction`,并定义一个方法来处理上传请求。这个方法需要接收`File`或`CommonsFileUpload`的`FileItem`对象,以接收上传的图片文件。 ...

    xheditor集成struts2上传图片

    本案例涉及的是将xheditor富文本编辑器与Struts2框架整合,实现图片上传功能。xheditor是一款强大的JavaScript在线编辑器,提供了丰富的文本编辑功能,而Struts2是一个流行的Java Web框架,用于构建MVC(模型-视图-...

    struts2上传必备jar包,避免出现struts2的升级漏洞!自己吃亏后分享

    这个bug是由Struts2上传文件后return SUCCESS后报的错误: java.lang.AbstractMethodError: be.telio.mediastore.ui.upload.GarryMultiPartRequest.cleanUp()V at org.apache.struts2.dispatcher.multipart....

    Struts2项目struts2 上传 下载 项目

    在这个“Struts2 上传下载项目”中,我们将深入探讨如何利用Struts2实现文件上传与下载功能,并结合MySQL数据库、DAO(数据访问对象)层以及MVC架构来构建一个完整的应用。 1. **Struts2框架基础** Struts2的核心...

    struts2上传分析

    Struts2作为一款流行的Java Web框架,其在处理文件上传方面提供了多种方法,使得开发者能够灵活地实现用户数据的上传功能。以下是对Struts2上传功能的详细分析: 1. **Struts2的上传方式** - **使用Struts2核心...

    struts2 上传文件超过最大值解决办法

    在Struts2框架中,处理文件上传是一项常见且重要的功能,尤其当涉及到大文件上传时,往往会遇到上传文件大小超过预设限制的问题。这不仅影响用户体验,还可能导致应用程序出现异常或错误。本文将深入探讨如何解决...

Global site tag (gtag.js) - Google Analytics