Struts2上传下载

 原理:

  表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:

  1) application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。
  2) multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。
  3) text/plain:这种方式主要适用于直接通过表单发送邮件的方式。
  文件上传是web应用经常用到的一个知识。原理是,通过为表单元素设置enctype=”multipart/form-data”属性,让表单提交的数据以二进制编码的方式提交,在接收此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。
  在Java领域中,有两个常用的文件上传项目:一个是Apache组织Jakarta的Common-FileUpload组件([url]http://commons.apache.org/fileupload/[/url]),另一个是Oreilly组织的COS框架([url]http://www.servlets.com/cos/[/url])。利用这两个框架都能很方便的实现文件的上传。
Strtus上传文件==================================
1,所需jars 

 
2, JSP 代码 ,注意:enctype="multipart/form-data" 
	<body>
		<form action="fileupload.action" method="post"
			enctype="multipart/form-data">
			上传文件
			<input type="file" name="targetFile" />
			<br />
			<input type="submit" value="上传">
		</form>
	</body>
 
3,UploadAction.java
//注意:上传下载中一定要继承ActionSupport.否则INPUT无法识别
public class UploadAction extends ActionSupport{
	private File targetFile; // 上传文件时候的缓存文件,
	// 必须和jsp中<input file>的name属性相同
	private String targetFileFileName; // file的name+FileName;
	private String targetFileContentType; // file的name+ContentType;
	public String execute() {
		System.out.println(targetFile.getPath());
		System.out.println(targetFileFileName); // 得到文件名
		System.out.println(targetFileContentType);
		String destPath = ServletActionContext.getServletContext().getRealPath(
				"/upload");
		try {
			InputStream is = new FileInputStream(targetFile);
			OutputStream os = new FileOutputStream(new File(destPath,
					targetFileFileName));
			int b = -1;
			byte[] buff = new byte[1024];
			while ((b = is.read(buff)) != -1) {
				os.write(buff, 0, b);
			}
			os.flush();
			os.close();
			is.close();
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
		return SUCCESS;
	}
    //  getter/setter....
 DownLoad.java
public class DownloadAction extends ActionSupport {
	private String filename; // 省略getter.setter方法
	// 去掉get,首字母小写得到tagetFileName,
	// 这个名字要和struts.xml中的
	// <result type="stream"> 标签中的<param name="inputName">的值一直
	//他是获取下载文件流的入口方法  
	public InputStream getTagetFileName() {
		InputStream is = ServletActionContext.getServletContext()
				.getResourceAsStream("/upload/" + filename);
		return is;
	}
	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}
}
 
4,Struts.xml文件编写
<struts>
	<constant name="struts.devMode" value="true" />
	<constant name="struts.action.extension" value="do,action,,"></constant>
	 <!-- 设置上传文件的大小最大是5M -->
	<constant name="struts.multipart.maxSize" value="5242880"></constant>
	<package name="default" namespace="/" extends="struts-default">
		<action name="fileupload" class="com.tarena.web.UploadAction">
		<!-- 引用系统默认拦截器,限制上传文件的类型 -->
			<interceptor-ref name="fileUpload">
				<param name="allowedTypes">image/png,image/jpeg,audio/mp3</param>
			</interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<result name="success">/success.jsp</result>
			<result name="error">/error.jsp</result><!-- 执行异常跳转的页面 -->
			<result name="input">/fail.jsp</result>  <!-- 如果上传尺寸超标或者类型错误,则跳转到此页面。 -->
		</action>
		
		<!-- 文件下载设置 -->
		<action name="filedownload" class="com.tarena.web.DownloadAction">
			<result type="stream"> <!-- 图片的返回类型是个流 -->
			<!-- 指定文件以附件形式下载 ,${filename}是DownloadAction.java中定义的输出属性,这里是指定下载文件的名字-->
				<param name="contentDisposition">attachment;filename="${filename}"</param>
				<!-- 获取要下载的文件,该文件名一定要在Action中提供其getter方法。 -->
				<param name="inputName">tagetFileName</param>
				<!-- 设置要下载的文件大小-->
				<param name="bufferSize">2048</param>
			</result>
		</action>
	</package>
	<!-- Add packages here -->
</struts>
 

5,测试地址:localhost:8008/struts2_fileUpload/filedownload.action?filename=0.jpg

附件下载: 

文章参考:http://blog.csdn.net/lisa0220/article/details/6400767

猜你喜欢

转载自lydia-fly.iteye.com/blog/2149818