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

转:struts2上传文件

阅读更多
上传文件是很多Web程序都具有的功能。Struts2本身没有提供解析上传文件内容的功能,它使用第三方的文件上传组件提供对文件上传的支持。所以我们要想利用Struts2实现文件上传的功能,首先要将commons-fileupload-1.2.1.jar和commons-io-1.4.jar复制到项目的WEB-INF/lib目录下。

我们知道,Struts1.x的上传组件需要一个ActionForm来辅助传递文件,而Struts2的上传组件却很简单,只用一个拦截器:org.apache.struts2.interceptor.FileUploadInterceptor(这个拦截器不用配置,是自动装载的),它负责调用底层的文件上传组件解析文件内容,并为Action准备与上传文件相关的属性值。这里要强调的是:处理文件上传请求的Action必须提供特殊样式命名的属性。例如,假设表单中文件选择框的名字为upload,那么Action就应该提供以下三个属性upload,uploadFileName,uploadContentType来分别表示上传文件的File对象、上传文件名以及上传文件内容类型。很多人因为忽略了这一点而犯错误。

下面是上传单个文件的JSP页面代码singleUpload.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"

   pageEncoding="UTF-8"%>

<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>上传单个文件</title>

</head>

<body>

<s:actionerror />

<s:form action="upload" method="post" enctype="multipart/form-data">

   <s:file name="upload" label="文件名" />

   <s:textfield name="description" label="文件描述" />

   <s:submit value="上传" />

</s:form>

</body>

</html>



注意粗体部分的设置,这是有上传控件的表单所要求的格式。下面是用于上传的动作类的完整代码:

package org.leno.struts2.action;



import java.io.*;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;



public class UploadAction extends ActionSupport {



   private static final long serialVersionUID = 1L;

   // 代表上传文件的File对象

   private File upload;

   // 上传文件名

   private String uploadFileName;

   // 上传文件的MIME类型

   private String uploadContentType;

   // 上传文件的描述信息

   private String description;

   // 保存上传文件的目录,相对于WEB应用程序的根路径,在struts.xml中配置

   private String uploadDir;



   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 getDescription() {

      return description;

   }



   public void setDescription(String description) {

      this.description = description;

   }



   public String getUploadDir() {

      return uploadDir;

   }



   public void setUploadDir(String uploadDir) {

      this.uploadDir = uploadDir;

   }



   @Override

   public String execute() throws Exception {

      String newFileName = null;

      // 得到当前时间自1970年1月1日0时0分0秒开始走过的毫秒数

      long now = System.currentTimeMillis();

      // 得到保存上传文件的目录的真实路径

      File dir = new File(ServletActionContext.getServletContext()

            .getRealPath(uploadDir));

      // 如果该目录不存在,就创建

      if (!dir.exists()) {

         dir.mkdirs();

      }

      // 为避免重名文件覆盖,判断上传文件是否有扩展名,以时间戳作为新的文件名

      int index = uploadFileName.lastIndexOf(".");

      if (index != -1) {

         newFileName = now + uploadFileName.substring(index);

      } else {

         newFileName = Long.toString(now);

      }

      // 读取保存在临时目录下的上传文件,写入到新的文件中

      InputStream is = new FileInputStream(upload);

      OutputStream os = new FileOutputStream(new File(dir, newFileName));

      byte[] buf = new byte[1024];

      int len = -1;

      while ((len = is.read(buf)) != -1) {

         os.write(buf, 0, len);

      }

      is.close();

      os.close();

      return SUCCESS;

   }



}



    在execute方法中的实现代码就很简单了,只是从临时文件复制到指定的路径(在这里是web应用程序下的uploadDir目录)中。上传文件的临时目录的默认值是javax.servlet.context.tempdir的值,但可以通过struts.properties(和struts.xml在同一个目录下)的struts.multipart.saveDir属性设置。Struts2上传文件的默认大小限制是2M(2097152字节),也可以通过struts.properties文件中的struts.multipart.maxSize修改,如struts.multipart.maxSize=102400 表示一次上传文件的总大小不能超过100K字节。另一种改变上传属性的方式是在struts.xml中配置constant。本文采用后者。

下面是我们要用到的Struts2的核心配置文件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>

   <!-- 上传文件的临时目录 -->

   <constant name="struts.multipart.saveDir" value="e:\\temp"></constant>

   <!-- 上传文件的总大小限制 -->

   <constant name="struts.multipart.maxSize" value="102400"></constant>

   <!-- 资源文件配置 -->

   <constant name="struts.custom.i18n.resources"

      value="ApplicationResources">

   </constant>

   <package name="default" extends="struts-default">

      <action name="upload"

         class="org.leno.struts2.action.UploadAction">

<!—文件上传拦截器 -->

         <interceptor-ref name="defaultStack">

            <!-- 设置Action能接受的文件的最大长度,而不是对上传文件的最大长度进行限制。

                (因为在Action处理之前,文件已经上传到服务器了。) -->

            <param name="fileUpload.maximumSize">102400</param>

            <param name="fileUpload.allowedTypes">

                image/gif,image/jpeg,image/pjpeg

            </param>

         </interceptor-ref>

         <result name="success">/success.jsp</result>

         <result name="input">/singleUpload.jsp</result>

         <param name="uploadDir">/WEB-INF/UploadFiles</param>

      </action>

   </package>

</struts>

当我们对文件上传进行了更多的控制,上传的文件不满足所指定的限制条件时,我们可以使用特定的I18N键添加相关的错误消息。在src下新建ApplicationResources.properties:

struts.messages.error.uploading=文件上传错误

struts.messages.error.file.too.large=文件上传长度超过了限制的长度

struts.messages.error.content.type.not.allowed=不容许上传这种类型的文件

这样,上传文件如果出错,框架去会自动导向到input结果页面,同时显示错误信息;如果成功,就可以导航到success.jsp。我们可以在success.jsp页中通过<s:property>获得文件的属性(文件名,文件内容类型,文件描述以及文件的长度),代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"

   pageEncoding="UTF-8"%>

<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>上传成功</title>

</head>

<body>

<h1>上传成功,文件信息如下:</h1>

文件名:<s:property value="uploadFileName" /><br/>

文件大小:<s:property value="upload.length()" /><br/>

文件类型:<s:property value="uploadContentType" /><br/>

文件描述:<s:property value="description" /><br/>

</body>

</html>

分享到:
评论

相关推荐

    第八章:struts2文件上传下载.ppt

    第八章:struts2文件上传下载.ppt

    个人总结:Struts2 上传文件的六种方法

    Struts2作为一款流行的Java Web框架,提供了多种方式来实现文件上传功能。下面将详细介绍在Struts2中实现文件上传的六种方法,并探讨如何将文件数据保存到数据库中。 1. **Struts2默认的FileUpload拦截器** Struts...

    struts2实现文件上传下载

    本篇文章将详细探讨如何在Struts2框架下实现文件的上传与下载。 首先,我们需要了解Struts2中的文件上传机制。Struts2提供了`FileUploadInterceptor`拦截器来处理文件上传请求。在处理文件上传时,开发者需要在...

    struts2上传文件源代码

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

    struts2文件上传下载源代码

    在Struts2中,文件上传和下载是常见的功能需求,特别是在处理用户交互和数据交换时。这篇博客文章提供的"struts2文件上传下载源代码"旨在帮助开发者理解和实现这些功能。 文件上传功能允许用户从他们的设备上传文件...

    IBM Struts2培训PPT.7z

    IBMStruts2培训PPT (大全集) 主讲:刘雷 完整实用 第一章:认识体验Struts2.ppt 第二章:struts2架构剖析.ppt ...第八章:struts2文件上传下载.ppt 第九章:struts2拦截器.ppt + Struts2开发详解.ppt

    Struts2多个文件上传

    在Struts2中,文件上传功能是一个常用特性,尤其在处理用户提交的多个文件时。本文将详细讲解如何使用Struts2进行多个文件的上传,重点是使用List集合进行上传。 首先,要实现Struts2的文件上传,必须引入必要的...

    swfuplaod+struts2实现多文件上传

    3. **创建Struts2 Action**:在Struts2框架中,创建一个处理文件上传的Action类,该类通常会包含一个`List&lt;HttpServletFileWrapper&gt;`类型的属性,用于接收上传的文件。 4. **编写Struts2配置**:在struts.xml配置...

    JavaEE Struts文件上传

    2. **添加Struts2插件**:Struts2的文件上传功能依赖于`struts2-convention-plugin`和`struts2-core`等库。在`struts.xml`配置文件中,需要启用Multipart解析器,例如添加`&lt;constant name="struts.multipart.parser...

    struts2 实现文件批量上传

    本项目实现了使用Struts2进行文件批量上传的功能,这涉及到几个关键的技术点,包括文件上传组件的选择、前端表单设计、后端处理逻辑以及存储策略。 1. **文件上传组件**:在Struts2中,我们通常使用`Commons ...

    Struts2上传文件(直接用request)

    Struts2上传文件(直接用request)

    struts2文件上传的两种方法

    Struts2作为一款流行的Java Web框架,提供了丰富的功能来处理用户表单数据,其中包括文件上传。文件上传在现代Web应用中十分常见,如用户头像、文档分享等场景。Struts2提供了两种主要的文件上传方式:单文件上传和...

    struts2框架下的文件上传

    Struts2框架是Java Web开发中的一个流行MVC(Model-View-Controller)框架,它提供了丰富的功能,包括处理表单提交、文件上传等。在Struts2中,文件上传是一个常见的需求,可以帮助用户从客户端上传文件到服务器。...

    struts2文件上传jar

    这个压缩包包含了实现Struts2文件上传所需的全部jar包,这些库文件对于理解和实现文件上传功能至关重要。 首先,我们要了解Struts2文件上传的基本流程。当用户通过表单提交包含文件输入字段的请求时,Struts2框架会...

    Struts2文件上传源码

    6. **源码分析**: 要深入理解Struts2的文件上传机制,你需要查看Struts2的源码,特别是`org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest`和`org.apache.struts2.components.Form`这两个类。...

    struts2上传文件进度条显示

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

    struts2文件上传实例

    1. **.struts2配置**:在Struts2框架中,需要在`struts.xml`配置文件中添加相应的action配置,声明文件上传的处理方法。通常,你需要设置`&lt;result&gt;`类型为`stream`,以便处理上传的文件。 2. **Action类**:创建一...

    struts2+jquery+ajax文件异步上传

    Struts2、jQuery和Ajax是Web开发中的三个关键组件,它们共同构成了文件异步上传的基础框架。这个项目是在MyEclipse环境下实现的一个简单的文件上传功能,让我们深入了解一下这些技术及其在文件上传中的应用。 首先...

    struts2文件上传例子.rar

    在“struts2文件上传例子.rar”这个项目中,开发者已经使用Struts2.0框架实现了一个简单的文件上传功能。MyEclipse 6.6是一个集成开发环境,支持Java EE项目开发,可以直接导入该项目进行运行和调试。 首先,我们...

Global site tag (gtag.js) - Google Analytics