`

struts2上传文件

阅读更多

一、struts2上传单个文件

第一步:确保在WEB-INF/lib在commons-fileupload-x.x.x.jar、commons-io-x.x.x.jar两个jar文件。这两个文件可以从struts2下载文件中的lib中找到,或者到http://commons.apache.org/下载。

第二步:把form表的enctype设置为:"multipart/form-data",method设置成"post"如下:

<form enctype="multipart/form-data" action="${pageContext.request.contextPath}/xxx.action" method="post">
  <input  type="file" name="uploadFile">
</form>

 第三步:在Action类中添加以下属性,action类的代码如下所示:

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;

public class TestAction {
	private File uploadFile; // 得到上传的文件,此属性对应于表单中文件字段的名称
	//下面的这两个属性的命名必须遵守上定的规则,即为"表单中文件字段的名称" + "相应的后缀"
	private String uploadFileContentType; // 得到上传的文件的数据类型,
	private String uploadFileFileName; // 得到上传的文件的名称

	public File getUploadFile() {
		return uploadFile;
	}

	public void setUploadFile(File uploadFile) {
		this.uploadFile = uploadFile;
	}

	public String getUploadFileContentType() {
		return uploadFileContentType;
	}

	public void setUploadFileContentType(String uploadFileContentType) {
		this.uploadFileContentType = uploadFileContentType;
	}

	public String getUploadFileFileName() {
		return uploadFileFileName;
	}

	public void setUploadFileFileName(String uploadFileFileName) {
		this.uploadFileFileName = uploadFileFileName;
	}

	public String execute() throws Exception {
		String realPath = ServletActionContext.getServletContext().getRealPath("/images");
		System.out.println(realPath);
		if(uploadFile !=null ){
			File destFile = new File(new File(realPath), uploadFileFileName);//根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
			if(!destFile.getParentFile().exists())//判断路径"/images"是否存在
				destFile.getParentFile().mkdirs();//如果不存在,则创建此路径
			//将文件保存到硬盘上,因为action运行结束后,临时文件就会自动被删除
			FileUtils.copyFile(uploadFile, destFile);
			ActionContext.getContext().put("message", "文件上传成功!");
		}
		return "success";
	}
}

 form.jsp页面的代码如下所示:

<body>
<form action="${pageContext.request.contextPath }/demo/test.action" method="post" enctype="multipart/form-data">
	文件:<input type="file" name="uploadFile"></input>
	<input type="submit" name="submit" value="上传"></input>
</form>
</body>

 代码${pageContext.request.contextPath }等于<%=request.getContextPath() %>。

result.jsp页面的代码如下:

<body>
文件类型:${uploadFileContentType }<br>
${uploadFileFileName} ${message}
 </body>

本人 进行测试,发现此时只要上传的文件不要超过2M,都可以顺利上传成功。上传完成后会返回文件的文件名等信息。如下所示:

文件类型:application/octet-stream

desktop.ini 文件上传成功!

在应用程序部署的文件夹下会产生一个images文件夹,在此文件夹下会有一个desktop.ini文件。

同进在控制台打印了如下的信息,说明上传时产生的临时文件删除成功:

2010-11-12 14:52:59 com.opensymphony.xwork2.util.logging.jdk.JdkLogger info
信息: Removing file uploadFile D:\workspace\eclipsespace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\struts_helloworld\upload__43a41dcc_12c3ec6e75a__8000_00000002.tmp

 

但要是我上传一个大于2M的文件,就会上传失败,控制台打印的信息如下所示:

警告: Unable to parse request
org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (3018061) exceeds the configured maximum (2097152)

。。。

警告: the request was rejected because its size (3018061) exceeds the configured maximum (2097152)

这是因为struts2一次上传文件时默认的总大小是2097152B,所以在默认情况下上传的文件不能大于2M。

此时在struts.xml文件中,增加代码<constant name="struts.multipart.maxSize" value="10701096"/> ,

将它的文件上传限制设为10M左右,上面的文件就能正常上传了。配置文件如下所示:

<struts>
<constant name="struts.multipart.maxSize" value="10701096"/> 
	<package name="myDemo" namespace="/demo" extends="struts-default">	
		<action name="test" class="demo.action.TestAction">
		<result>/WEB-INF/jsp/result.jsp</result>
		</action>
	</package>
</struts>

 注意:struts2中的文件限制参数<constant name="struts.multipart.maxSize" value="10701096"/>并不是可以无限制的改大的,一般不能太大,以不超过10M的文件。这是因为web的性质决定的。基于web上传的文件都不能太大,如果要上传更大的文件,可以考虑使用浏览器插件(其实是一种通讯软件),类似于迅雷这样子的软件。这些软件都是基于socket来上传文件的。

 

二、struts2上传多文件

<1> 在form表单中的有多个file类型的input节点

<body>
<form action="${pageContext.request.contextPath }/demo/test.action" method="post" enctype="multipart/form-data">
	文件1:<input type="file" name="uploadFiles"></input>
	文件2:<input type="file" name="uploadFiles"></input>
	文件3:<input type="file" name="uploadFiles"></input>
	<input type="submit" name="submit" value="上传"></input>
</form>
</body>

 <2>action类如下所示:

public class TestAction {

	// 可以定义成数组类型,也可以定义成list
	private File[] uploadFiles; // 得到上传的文件,此属性对应于表单中文件字段的名称
	// 下面的这两个属性的命名必须遵守上定的规则,即为"表单中文件字段的名称" + "相应的后缀"
	private String[] uploadFilesContentType; // 得到上传的文件的数据类型,
	private String[] uploadFilesFileName; // 得到上传的文件的名称

//setter和getter方法	
public String execute() throws Exception {
		String realPath = ServletActionContext.getServletContext().getRealPath(
				"/images");
		File file = new File(realPath);
		if (!file.exists())
			file.mkdirs();
		if (uploadFiles != null) {
			for (int i = 0; i < uploadFiles.length; i++) {
				File uploadFile = uploadFiles[i];
				FileUtils.copyFile(uploadFile, new File(file,
						uploadFilesFileName[i]));
			}
			ActionContext.getContext().put("message", "文件上传成功!");
		}
		return "success";
	}
}
 

 

 

分享到:
评论
1 楼 小胖vs小猪 2013-05-22  
你好,文章写的很不错;就是有个疑问,在单文件上传的时候 String realPath = ServletActionContext.getServletContext().getRealPath("/images");这里得到的路径是struts里面配置的文件保存的路径吗?可以把struts的配置文件补充一下么。谢谢。

相关推荐

    struts2上传文件源代码

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

    Struts2 上传文件

    ### Struts2 上传文件详解 #### 一、文件上传的原理 在Web开发中,文件上传是一项常见的功能需求。Struts2框架提供了强大的支持来处理这类操作,尤其是在处理文件上传方面有着简单而灵活的方法。 ##### 1. 表单...

    struts2上传文件进度条显示

    这里我们启用了multipart/form-data类型的数据解析,并设置了最大上传文件大小为20MB。 接下来,创建一个Action类来处理文件上传请求。这个类需要继承自`org.apache.struts2.dispatcher.multipart....

    Struts2上传文件(直接用request)

    Struts2上传文件(直接用request)

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

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

    struts2 上传文件及打包下载zip

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

    Struts2上传文件

    在Struts2中,文件上传功能是一个常见的需求,它允许用户从客户端上传文件到服务器端进行处理或存储。本篇文章将深入探讨Struts2中的文件上传机制,包括单个文件上传和多个文件上传。 ### 单个文件上传 #### 1. ...

    struts2上传文件及拦截器

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

    struts2上传文件、生成缩略图、添加文字和图片水印

    以上就是关于"Struts2上传文件、生成缩略图、添加文字和图片水印"的主要知识点,理解并掌握这些技术可以帮助开发者实现高效、安全的图片处理功能。在实际项目中,应根据具体需求灵活运用,并不断优化以提高用户体验...

    struts2实现文件上传下载

    `FileInfo`是自定义的类,包含`File`对象和`String`对象,分别表示上传文件的实际内容和文件名。 1. **配置Struts2的文件上传** 在`struts.xml`配置文件中,为需要支持文件上传的Action添加`params`和`fileUpload`...

    Struts2上传文件源码

    总结一下,这个"Struts2上传文件源码"示例主要涵盖了以下知识点: 1. Struts2的拦截器机制和`FileUploadInterceptor`。 2. 配置文件中启用文件上传拦截器。 3. 创建Action类处理文件上传,包括接收和处理上传文件。...

    解决Struts2上传文件后文件大小变大

    ### 解决Struts2上传文件后文件大小变大的方法 #### 背景与问题描述 在使用Struts2框架进行文件上传时,有时会遇到一个棘手的问题:上传后的文件大小比原始文件大。这不仅增加了服务器的存储负担,还可能导致其他...

Global site tag (gtag.js) - Google Analytics