`
longgangbai
  • 浏览: 7349256 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

struts2文件上传下载(提供原代码)

阅读更多

开发上传下载必须注意的问题:

Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。

1.先将表单的提交方式设为POST,然后将enctype设为multipart/form-data,这并没有什么特别之处。接下来,<s:file/>标志将文件上传控件绑定到Action的myFile属性。

2.FileUploadAction中我分别写了setMyFileContentType、setMyFileFileName、setMyFile和setCaption四个Setter方法,后两者很容易明白,分别对应FileUpload.jsp中的<s:file/>和<s:textfield/>标志。但是前两者并没有显式地与任何的页面标志绑定,那么它们的值又是从何而来的呢?其实,<s:file/>标志不仅仅是绑定到myFile,还有myFileContentType(上传文件的MIME类型)和myFileFileName(上传文件的文件名,该文件名不包括文件的路径)。因此,<s:file name="xxx" />对应Action类里面的xxx、xxxContentType和xxxFileName三个属性。

3.struts2必须的jar文件如下:.classpath文件配置jar文件如下

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
 <classpathentry kind="src" path="src"/>
 <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 <classpathentry kind="con" path="com.genuitec.eclipse.j2eedt.core.J2EE14_CONTAINER"/>
 <classpathentry kind="lib" path="WebRoot/WEB-INF/lib/commons-logging-1.0.4.jar"/>
 <classpathentry kind="lib" path="WebRoot/WEB-INF/lib/freemarker-2.3.8.jar"/>
 <classpathentry kind="lib" path="WebRoot/WEB-INF/lib/ognl-2.6.11.jar"/>
 <classpathentry kind="lib" path="WebRoot/WEB-INF/lib/commons-collections-2.0.jar"/>
 <classpathentry kind="lib" path="WebRoot/WEB-INF/lib/commons-io-1.3.1.jar"/>
 <classpathentry kind="lib" path="WebRoot/WEB-INF/lib/commons-fileupload-1.2.jar"/>
 <classpathentry kind="lib" path="WebRoot/WEB-INF/lib/struts2-core-2.0.14.jar"/>
 <classpathentry kind="lib" path="WebRoot/WEB-INF/lib/xwork-2.0.5.jar"/>
 <classpathentry kind="output" path="WebRoot/WEB-INF/classes"/>
</classpath>

 

web.xml的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 <filter>
  <filter-name>struts2-cleanup</filter-name>
  <filter-class>
   org.apache.struts2.dispatcher.ActionContextCleanUp
  </filter-class>
 </filter>
 <filter-mapping>
  <filter-name>struts2-cleanup</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
 <filter>
  <filter-name>struts2</filter-name>
  <filter-class>
   org.apache.struts2.dispatcher.FilterDispatcher
  </filter-class>
 </filter>
 <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

 <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
</web-app>

 


在classpath中配置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="/tmp"/>
      <package name="fileupload" extends="struts-default">
          <action name="fileUpload" class="cn.com.unusap.spring.fileupload.FileUploadAction">
          <interceptor-ref name="fileUploadStack"></interceptor-ref>
             <result name="success">/Upload.jsp</result>
          </action>
      </package>
    </struts>
FileUploadAction内容如下:

package cn.com.unusap.spring.fileupload;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 关于文件上传
 * 1>File对应的表单中file名称其中影响的三个字段为file的表单名称为:xxx,xxxFileName,xxxContentType
 * 2>在struts.xml中action中添加上传下载的拦截器fileUploadStack同时必须classpath路径中添加commons-fileupload.jar,Commons-io.jar(注意必须对应相应的版本jar类包)
 * @author Administrator
 *
 */
public class FileUploadAction extends ActionSupport {
 org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest f;
 private static final int BUFFER_SIZE = 16 * 1024;
 private File imgFile;
 private String imgFileContentType;
 private String imgFileFileName;
 private String caption;

 public File getImgFile() {
  return imgFile;
 }

 public void setImgFile(File imgFile) {
  this.imgFile = imgFile;
 }

 public String getImgFileContentType() {
  return imgFileContentType;
 }

 public void setImgFileContentType(String imgFileContentType) {
  this.imgFileContentType = imgFileContentType;
 }

 

 public String getImgFileFileName() {
  return imgFileFileName;
 }

 public void setImgFileFileName(String imgFileFileName) {
  this.imgFileFileName = imgFileFileName;
 }

 public String getCaption() {
  return caption;
 }

 public void setCaption(String caption) {
  this.caption = caption;
 }

 private static void copy(File src, File dst) {
  try  {
            InputStream in = null ;
            OutputStream out = null ;
             try  {               
                in = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE);
                out = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE);
                 byte [] buffer = new byte [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();
        }

 }

 private static String getExtention(String fileName) {
  int pos = fileName.lastIndexOf(".");
  return fileName.substring(pos);
 }

 @Override
 public String execute() {
  this.imgFileFileName = new Date().getTime()
    + getExtention(this.imgFileFileName);
  File imageFile = new File(ServletActionContext.getServletContext()
    .getRealPath("/UploadImages")
    + "/" + this.imgFileFileName);
  copy(this.imgFile, imageFile);
  return SUCCESS;
 }

}

 

分享到:
评论
8 楼 longgangbai 2010-01-26  
wzglovejava 写道
struts2使用文件上传的话,也可以不使用他的<s:file>使用普通的<file>也可以,这就解决了Ajax控件不能用的问题,在上传文件时,必须要指定好文件的路径,否则得话可能读到了临时文件中,上传成功,但是你却看不到,我以前经常用到这些,所以看到你们的讨论,就说一些,希望能够帮到你们


其实使用<s:file> 和<input type="file"> 肯定一样,因为struts2.0使用他们都是通过OGNL实现传递参数的过程!
7 楼 wzglovejava 2010-01-26  
struts2使用文件上传的话,也可以不使用他的<s:file>使用普通的<file>也可以,这就解决了Ajax控件不能用的问题,在上传文件时,必须要指定好文件的路径,否则得话可能读到了临时文件中,上传成功,但是你却看不到,我以前经常用到这些,所以看到你们的讨论,就说一些,希望能够帮到你们
6 楼 longgangbai 2010-01-19  
开心凯迪GiveMe 写道
楼主我像想你请教一下
这个图片上传到uploadImange这个文件家里面
但是怎么上传了之后不能看到这个图片呢

但是能够从这里读取出来,说名文件上传是成功了



注意:uploadImage这个目录首先必须存在,如果不存在可能上传文件在默认的临时默认,请参看struts.properties文件的相对目录中。


### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
# struts.multipart.parser=cos
# struts.multipart.parser=pell
struts.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default
struts.multipart.saveDir=
struts.multipart.maxSize=2097152

struts.properties中可以设置默认的临时目录,和上传文件的大小以及上传的方式

5 楼 开心凯迪GiveMe 2010-01-16  
楼主我像想你请教一下
这个图片上传到uploadImange这个文件家里面
但是怎么上传了之后不能看到这个图片呢

但是能够从这里读取出来,说名文件上传是成功了
4 楼 longgangbai 2009-06-14  
bryan.liu 写道

好像&lt;s:file&gt; 控件不能和别的表单控件共存在一个Form里面,特别是Ajax控件,会导致Ajax控件无法工作。 我在项目里面的时候只能把上传作为一个单独的页面。上传完了再回到原来的页面(因为原来的页面里面有好几个AJAX标签)。 比较麻烦。



可以放多个&lt;s:file&gt; 控件,不过Action中三个字段必须使用数组形式而已,至于上传过程好像一样的,没有什么区别哦
3 楼 longgangbai 2009-06-14  
ArdenL 写道

为什么不用 org.apache.commons.io.FileUtils&nbsp; ,而还要自己写流策略哪?private File upload;private String uploadContentType;private String uploadFileName;其中:后两个属性的名字有File 的属性名字决定,自动加载名字。String targetFileName = "/opt/files/" + uploadFileName;FileUtils.copyFile(upload,targetFileName)



哈哈,针对struts2上传下载必须的属性三个字段哦,在获取三个属性之后才可以使用FileUtils上传文件。希望你看一下struts2的源代码哦,可以继续讨论哦
2 楼 ArdenL 2009-05-11  
为什么不用 org.apache.commons.io.FileUtils  ,
而还要自己写流策略哪?


private File upload;
private String uploadContentType;
private String uploadFileName;

其中:后两个属性的名字有File 的属性名字决定,自动加载名字。
String targetFileName = "/opt/files/" + uploadFileName;
FileUtils.copyFile(upload,targetFileName)

1 楼 bryan.liu 2009-05-04  
好像<s:file> 控件不能和别的表单控件共存在一个Form里面,特别是Ajax控件,会导致Ajax控件无法工作。
我在项目里面的时候只能把上传作为一个单独的页面。上传完了再回到原来的页面(因为原来的页面里面有好几个AJAX标签)。
比较麻烦。

相关推荐

    struts2文件上传下载源代码

    这篇博客文章提供的"struts2文件上传下载源代码"旨在帮助开发者理解和实现这些功能。 文件上传功能允许用户从他们的设备上传文件到服务器。在Struts2中,这通常通过表单实现,表单包含一个`&lt;input type="file"&gt;`...

    struts2实现文件上传下载

    Struts2提供了`FileUploadInterceptor`拦截器来处理文件上传请求。在处理文件上传时,开发者需要在Action类中声明一个`List&lt;FileInfo&gt;`类型的字段,用于接收上传的文件信息。`FileInfo`是自定义的类,包含`File`对象...

    基于Struts2的文件上传下载功能的完整源代码。

    在基于Struts2的文件上传下载功能中,它提供了处理用户上传文件和提供文件下载的服务。这个完整的源代码是实现这些功能的一个实例,经过测试确保了其正确性和可用性。 首先,我们要理解Struts2中的Action类。Action...

    struts实现文件上传和下载源代码

    在这个"struts实现文件上传和下载源代码"项目中,我们将会探讨如何使用Struts框架来实现在Web应用中进行文件的上传和下载功能,同时还会关注对于大文件(超过3MB)的处理策略。 1. **文件上传** 文件上传是Web应用...

    基于struts的文件上传下载源代码

    在本"基于Struts的文件上传下载源代码"中,我们可以深入理解Struts如何处理文件上传和下载操作,这对于初学者来说是一个非常实用的学习资源。 首先,文件上传在Web应用中是常见的功能,它允许用户从本地计算机选择...

    struts2文件上传和下载

    在Struts2中,文件上传和下载是常见的功能需求,对于用户交互和数据交换至关重要。以下是对这些知识点的详细阐述: 1. **文件上传**: 在Struts2中,文件上传主要依赖于`Commons FileUpload`库,它是一个Apache提供...

    struts实现的文件上传下载功能

    总结起来,使用Struts实现文件上传下载涉及前端表单设计、后端处理逻辑、文件存储策略以及安全控制等多个方面。在实践中,我们还需要考虑到性能优化和用户体验提升,例如使用异步上传、进度条展示等技术。

    struts2文件上传下载

    Struts2作为一个成熟的MVC框架,提供了简单的API和标记库来处理文件上传下载的业务逻辑。下面是基于给定文件内容的知识点详细说明。 ### Struts2文件上传知识点 1. **Struts2的form标签配置** 在Struts2中进行...

    struts2上传文件源代码

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

    struts2_uploadify带进度条的多文件上传下载

    总之,这个项目实例为使用Struts2和Uploadify实现带进度条的多文件上传及下载功能提供了一个基础模板,对于学习和实践此类功能的开发者来说是一个有价值的参考。通过深入研究和理解这个项目的代码,可以提升对Struts...

    struts2文件上传下载实例

    在“struts2文件上传下载实例”中,我们将探讨如何在Struts2框架下实现文件的上传和下载功能,这对于许多Web应用程序来说是必不可少的特性。 首先,`pom.xml`文件是Maven项目对象模型的配置文件,它定义了项目的...

    struts2实现多文件上传下载

    需求 1.能够对多个文件进行上传(可以选择上传文件个...提供多文件上传,上传成功后,提供刚上传的文件下载功能(其他的都可以在其上面进行扩充) 多文件 上传 下载 随意文件 java Struts2 单例 配置 动态读取 李顺利

    Struts2 文件上传下载代码 Struts2

    在Struts2中,文件上传和下载是常见的功能需求,主要用于处理用户通过表单提交的文件数据。以下是对文件上传下载的核心知识点的详细说明: 1. **文件上传组件**: Struts2支持多种文件上传组件,如Commons ...

    struts2文件上传下载(注解版)

    在本项目中,我们关注的是Struts2中的文件上传和下载功能,这些功能是Web开发中常见的需求,尤其在处理用户数据提交或提供资源下载时。下面将详细介绍这个“struts2文件上传下载(注解版)”项目的关键知识点。 1. ...

    Struts2多个文件上传

    Struts2对这些库进行了封装,使得文件上传的代码更加简洁,同时减少了不同上传任务之间的编程差异。 在进行文件上传时,HTML表单需要设置`enctype="multipart/form-data"`,这是为了指示浏览器以二进制流的形式发送...

    struts2文件上传

    在Struts2框架中,文件上传是通过特定的拦截器实现的,这些拦截器处理了文件上传请求并提供了安全性和大小限制。下面将详细讨论这个主题。 首先,我们来看配置拦截器的部分。在Struts2中,`struts.xml`是配置文件,...

    [原]Struts2-文件上传与下载

    在Struts2中,文件上传和下载是常见的功能需求,它们对于用户交互性至关重要,例如用户提交表单时上传图片或文档,或者系统提供文件资源下载服务。本篇文章将深入探讨Struts2中的文件上传和下载机制。 首先,我们来...

    java struts2 文件上传 支持大文件

    Struts2框架提供了丰富的插件和配置来支持文件上传,其中包括进度条显示,以提升用户交互体验。以下是对这个话题的详细解释。 1. **Struts2 文件上传基础** - Struts2 使用 `struts2-core` 包中的 `...

    struts框架-文件上传下载

    2. Struts2中的文件上传:Struts2提供了更简洁的文件上传方式。在JSP页面中,可以使用`&lt;s:file&gt;`标签来创建文件选择控件。在Action类中,使用`@SkipValidation`注解标记文件上传方法,然后定义对应的`java.io.File`...

    Struts2文件上传源码

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

Global site tag (gtag.js) - Google Analytics