Struts2--上传文件

       文件的上传和下载是Web应用中常用的功能。一般情况下可以通过使用二进制编码的方式来获得请求参数的值,从而通过二进制流来获得上传文件内容。这种手动编程方式比较麻烦,需要手动地控制二进制流,相当复杂。不过可以使用其他开源组织提供的上传项目来简单地完成文件上传。下面通过Struts2框架来完成文件的上传。

 

第一步:在WEB-INF/lib下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar(如果要用到FileUtils类)。这2个文件可以从http://commons.apache.org/下载

 

第二步:把form表单的enctype设置为:"mulipart/form-data",如下:

<form action="${pageContext.request.contextPath }/test/hello" enctype="multipart/form-data" method="post">
          <input type="file" name="myFile"/>
          <input type="submit" value="上传"/>
</form>

 

第三步:在action中添加如下属性:

public class HelloWorldAction {
	private File myFile; // 上传的文件,变量名要与表单中file类型的属性名相同
	private String myFileFileName; // 上传的文件名,变量的名字为File的变量名myFile+FileName(这是固定写法)
	private String myFileContentType; // 上传的文件类型,变量的名字为File的变量名myFile+ContentType(这是固定写法)

	public File getMyFile() {
		return myFile;
	}

	public void setMyFile(File myFile) {
		this.myFile = myFile;
	}

	public String getMyFileFileName() {
		return myFileFileName;
	}

	public void setMyFileFileName(String myFileFileName) {
		this.myFileFileName = myFileFileName;
	}

	public String getMyFileContentType() {
		return myFileContentType;
	}

	public void setMyFileContentType(String myFileContentType) {
		this.myFileContentType = myFileContentType;
	}

	public String execute() throws Exception {
		String realPath = ServletActionContext.getServletContext().getRealPath(
				"/files");
		System.out.println(realPath);
		File destFile = new File(new File(realPath), myFileFileName);
		if (myFile != null) {
			/* 如果保存文件目录的上一级目录不存在 */
			if (!destFile.getParentFile().exists()) {
				destFile.getParentFile().mkdirs();
			}
			
			/* 赋值文件到目标文件 */
			FileUtils.copyFile(myFile, destFile);
			ActionContext ctx = ActionContext.getContext();
			ctx.put("message", "上传成功");
			ctx.put("file", this.getMyFile());
			ctx.put("fileName", this.getMyFileFileName());
			ctx.put("fileContentType", this.getMyFileContentType());
		}
		return "success";
	}
}

 action中的属性名称要和表单中的文件类型的属性名称一致

 

struts.xml的配置:

<struts>	
	<constant name="struts.configuration.xml.reload" value="true" />
	
	<package name="itcast" namespace="/test" extends="struts-default">
		<action name="hello" class="cn.itcast.action.HelloWorldAction" method="execute" >			
			<result name="success">/WEB-INF/page/hello.jsp</result>
		</action>
	</package>	
</struts>

 

hello.jsp:

<body>
      ${requestScope.message }<br/>
      ${requestScope.file }<br/>
      ${requestScope.fileName }<br/> 
      ${requestScope.fileContentType }<br/>
</body>

 

说明:如果是多文件上传,需要在action中把文件的类型定义为数组或者是集合类型

package com.struts.action;

import java.io.File;

public class FileUploadAction {
	private File[] myFile;
	private String[] myFileFileName;

	public File[] getMyFile() {
		return myFile;
	}

	public void setMyFile(File[] myFile) {
		this.myFile = myFile;
	}

	public String[] getMyFileFileName() {
		return myFileFileName;
	}

	public void setMyFileFileName(String[] myFileFileName) {
		this.myFileFileName = myFileFileName;
	}

}

 

响应的页面为:

<form action="${pageContext.request.contextPath }/test/hello" enctype="multipart/form-data" method="post">
          <input type="file" name="myFile"/>
          <input type="file" name="myFile"/>
          <input type="submit" value="上传"/>
</form>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值