struts2之文件上传

一,概述

用Apache的fileupload组件实现上传下载比自己动手写一大堆代码方便很多,用struts2提供的上传下载功能则更是简单了不少.虽然简单,但涉及到的点还是有点多,稍微弄错,控制台就给你一个强烈的反应,一大堆的错误日志.写一篇博客,巩固一下.(IDE:MyEclipse)

二,走进文件上传

1)jsp页面准备

 <form  name="frmFile" action="${pageContext.request.contextPath }/fileUploadAction"
    enctype="multipart/form-data" method="post">
    	
    	文件:<input type="file" name="file1"/><br/>
    	
    	<input type="submit" value="上传"/><br/>
    </form>
在upload.jsp页面的body标签内添加一个表单,配置好路径,通过fileUploadAction访问FileUploadAction.java中的上传业务方法;需要注意的是,上传的表单必须声明enctype="multipart/form-data";方法肯定是指定为post了.

2)Action类开发

package com.bighuan.e_fileupload;

import java.io.File;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.FileUploadInterceptor;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 文件上传Action类
 * @author bighuan
 *
 */
public class FileUploadAction extends ActionSupport {

	/**
	 * 对应表单里的 文件:<input type="file" name="file1"/><br/>
	 */
	private File file1;
	// 文件名
	private String file1FileName;
	// 文件类型(MIME),服务器认识的类型
	private String file1ContentType;

	public File getFile1() {
		// FileUploadInterceptor
		return file1;
	}

	public void setFile1(File file1) {
		this.file1 = file1;
	}

	public String getFile1FileName() {
		return file1FileName;
	}

	public void setFile1FileName(String file1FileName) {
		this.file1FileName = file1FileName;
	}

	public String getFile1ContentType() {
		return file1ContentType;
	}

	public void setFile1ContentType(String file1ContentType) {
		this.file1ContentType = file1ContentType;
	}

	@Override
	public String execute() throws Exception {
		// ****拿到上传的文件,进行处理****
		// 把文件上传到upload目录
		/**
		 * file1就是srcFile
		 */
		String path = ServletActionContext.getServletContext().getRealPath(
				"/upload");
		// 创建目标文件对象,文件对象的名字为file1FileName
		File destFile = new File(path, file1FileName);

		// 把上传的文件拷贝到目标文件中
		// FileUtils.copyFile(srcFile, destFile);
		FileUtils.copyFile(file1, destFile);
		return SUCCESS;
	}
}
a)在Action中,声明private File file1,这个File的变量名必须叫file1,对应于表单里提交过来的那个文件的name="file1",然后struts2的拦截器就会进行相应的数据封装了,就和普通数据(如表单提交过来的username,pwd的信息)的封装是一样的;同时还要实现file1对应的setter和getter方法;
b)那file1FileName属性呢?file1FileName对应于表单提交过来的文件的文件名,命名格式也是固定的(你所声明的File变量名称拼接上FileName如:file1FileName),实现对应的setter和getter方法,就可以拿到对应文件的文件名.你上传的是XXX.jpg,得到的file1FileName就是XXX.jpg,由此类推.还有file1ContentType文件类型也是类似的用法,记住即可.了解了就容易记住...
c)上传的核心业务逻辑就在execute()方法中,本文上传文件是要将文件上传到WebRoot目录下的upload目录下.通过servlet的API拿到upload的绝对路径(如本项目的path为:\develop\tomcat\apache-tomcat-7.0.77\webapps\day29_struts2\upload).有了文件名,有了路径,就可以创建目标文件对象new File(path,File1FileName)了,然后通过FileUtils的copyFile方法就可以实现上传文件的拷贝,这样就上传成功.

3)在struts.xml中配置Action

<package name="file_upload" extends="struts-default">
		<!-- action name 不要写成fileUpload,fileUpload是一个关键字,因为struts内部可能用了这个name,容易出错 -->
		<action name="fileUploadAction" class="com.bighuan.e_fileupload.FileUploadAction" method="execute">
		
		
		<!-- 限制运行上传的文件的类型 -->
		<interceptor-ref name="defaultStack">
		<!-- 限制运行文件的扩展名 -->
			<param name="fileUpload.allowedExtensions">txt,jpg,jar</param>
		</interceptor-ref>
		
		
		<result name="success">/e/success.jsp</result>
		<!-- 配置错误视图 -->
		<result name="input">/e/error.jsp</result>
		</action>
		
		

	</package>
a)注意,敲黑板了哈,提醒自己,哈哈哈...<Action>的name不要写成"fileUpload",这是strut2的一个关键字吧,换一个名字,如果你偏要那么干,就出错了...
b)可通过拦截器限制上传文件的类型.
c)成功就跳转到success.jsp;报错的话浏览器页面会显示一个input视图,这样不太好看,就通过input自己配置一个错误页面error.jsp就行.
d)struts2默认上传大小为2M,可在strtus.xml中通过常量更改大小.
<!-- 4,struts.multipart.maxSize=2097152 ,默认是2M,改为80M-->
	<constant name="struts.multipart.maxSize" value="83886080"></constant>

4)运行

启动服务器,部署项目,上传文件,成功了就到服务器相应项目下的upload下看有没有自己上传的文件.就这样...

三,总结

下一篇当然就是关于文件下载的博客了,敬请期待吧!!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值