使用Struts2进行文件上传

Struts2默认采用Jakarta的Common-FileUpload文件上传框架,因此我们需要在应用中添加两个jar包:commons-io-1.4.jar和commons-fileupload-1.2.1.jar。

假设文件上传页面为:

 

<s:form action="upload.action" method="post" enctype="multipart/form-data">
  		<s:textfield label="文件标题" name="title"/>
  		<s:file label="选择文件" name="upload"></s:file>
  		<s:submit value="上传"/>
 </s:form>

 

 在Action中,我们需要3个属性来封装文件域的信息:

 

  1. 类型为File的xxx属性,封装该文件域对应的文件内容。
  2. 类型为String的xxxFileName属性,封装文件域对应文件的文件名。
  3. 类型为String的xxxContentType属性,封装了该文件域对应文件的文件类型。
UploadAction代码如下:
package com.test.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {
	//封装文件标题请求参数的属性
	private String title;
	//封装上传文件域的属性
	private File upload;
	//封装上传文件类型的属性
	private String uploadContentType;
	//封装上传文件名的属性
	private String uploadFileName;
	
	//接受依赖注入的属性,文件保存路径
	private String savePath;
	//允许上传的文件类型
//	private String allowTypes;
	
	@Override
	public String execute() throws Exception {
		
		//先判断文件上传类型
//		String filterResult = filterType(getAllowTypes().split(","));
//		if(filterResult != null){
//			ActionContext.getContext().put("typeError","您要上传的文件类型不正确");
//			return filterResult; //filterResult此时等于input
//		}
		if(getUpload() == null) {
			ActionContext.getContext().put("typeError","您要上传的文件类型不正确");
			return INPUT;
		}
			
		
		//以服务器的文件保存地址savePath和原文件名建立上传文件输出流
		FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName());
		//以上传文件建立一个文件上传流
		FileInputStream fis = new FileInputStream(getUpload());
		//将上传文件的内容写入服务器
		byte[] buffer = new byte[1024];
		int len = 0;
		while((len = fis.read(buffer)) > 0) {
			fos.write(buffer,0,len);
		}
		// TODO Auto-generated method stub
		return SUCCESS;
	}

//	public String getAllowTypes() {
//		return allowTypes;
//	}
//
//	public void setAllowTypes(String allowTypes) {
//		this.allowTypes = allowTypes;
//	}

	public String getSavePath() throws Exception {
		//获取上传路径
		return ServletActionContext.getRequest().getRealPath(savePath);
	}
	
	public void setSavePath(String savePath) {
		this.savePath = savePath;
	}
	
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public File getUpload() {
		return upload;
	}
	public void setUpload(File upload) {
		this.upload = upload;
	}
	public String getUploadContentType() {
		return uploadContentType;
	}
	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}
	public String getUploadFileName() {
		return uploadFileName;
	}
	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}
	
	/**
	 * 过滤文件类型
	 * @param types 系统所有允许上传的文件类型
	 * @return 如果上传文件的类型符合要求,返回null,否则返回input字符串
	 */
	public String filterType(String[] types) {
		//得到上传文件的类型
		String fileType = getUploadContentType();
		//遍历允许上传的文件类型,并判断是否允许上传
		for(String type : types) {
			if(type.equals(fileType))
				return null;
		}
		return INPUT;
	}
}

 然后在struts.xml文件中进行配置:
<action name="upload" class="com.test.action.UploadAction">
			<!-- 配置fileUpload的拦截器 -->
			<interceptor-ref name="fileUpload">
				<param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
				<param name="maximumSize">102400</param>
			</interceptor-ref>
			<!-- 如果需要使用文件上传拦截器来过滤文件大小或者过滤文件内容,则必须显式配置引用Struts默认拦截器栈 -->
			<interceptor-ref name="defaultStack"/>
			<param name="savePath">/upload</param>
			<!--  
			<param name="allowTypes">image/bmp,image/png,image/gif,image/jpeg</param>
			-->
			<result>success.jsp</result>
			<result name="input">upload.jsp</result>
</action>
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值