struts2之文件上传下载方法

转眼过去俩月了,我的学习进度也从初始的JAVA核心,JavaWeb,到了对ssh框架的学习。
今天就来讲讲struts2框架实现的文件上传下载,主要难点和易错点在于对struts.xml的配置。
 首先,我学习写了一个UploadFileAction类,在其中定义了四个基本的参数,生成了getter,setter方法(其中getDfName()方法与默认方法有所区别),并且写好了文件上传下载,显示文件列表的方法
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.apache.struts2.ServletActionContext;

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

public class UploadFileAction extends ActionSupport{
	//定义接收参数
	private File upload;
	private String uploadFileName;
	private String uploadContentType;
	/**
	 * 写上传方法
	 * @return
	 * @throws IOException 
	 */
	public String saveFile() throws IOException{
		//获取路径
		String path = ServletActionContext.getServletContext().getRealPath("/");
		//创建文件夹
		File file = new File(path+"upFile/");
		//判断文件
		if(!file.exists()&&!file.isDirectory()){
			file.mkdir();
		}
		//定义输出流,指定文件的写入路径
		FileOutputStream fos = new FileOutputStream(file+"/"+uploadFileName);
		FileInputStream fis = new FileInputStream(upload);
		//写
		byte[] bt = new byte[1024];
		int len = 0;
		while((len=fis.read(bt))>0){
			fos.write(bt,0,len);
		}
		//关闭流
		fos.close();
		fis.close();
		return SUCCESS;
	}
	public String showFilePath(){
		//获取路径
		String filePath = ServletActionContext.getServletContext().getRealPath("/"+"upFile/");
		//得到文件夹
		File file = new File(filePath);
		//取出文件夹中文件名数组
		File[] fi = file.listFiles();
		List<String> list = new ArrayList<String>();
		//定义集合接收数组遍历的数据
		for (File fil : fi) {
			list.add(fil.getName());
		}
		ActionContext.getContext().put("list", list);
		return "showListPath";
	}
	//定义一个下载文件名
	private String dfName;
	
	/**
	 * 修改get方法内容,返回一个文件流
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public String getDfName() throws UnsupportedEncodingException {
		//设置响应内容的格式
		ServletActionContext.getResponse().setHeader("charset", "ISO8859-1");
		return new String(dfName.getBytes(),"ISO8859-1");//返回文件流
	}
	/**
	 * 开始下载
	 * @return
	 */
	public InputStream getMyfile(){
		return ServletActionContext.getServletContext().getResourceAsStream("upFile/"+dfName);
	}
	public void setDfName(String dfName) {
		this.dfName = dfName;
	}
	public File getUpload() {
		return upload;
	}
	public void setUpload(File upload) {
		this.upload = upload;
	}
	public String getUploadFileName() {
		return uploadFileName;
	}
	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}
	public String getUploadContentType() {
		return uploadContentType;
	}
	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}
}
其次,我学习了对于struts.xml的配置,易错点在于对拦截器属性和result属性的配置上,需要注意的部分,我在代码中进行了注释
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<!-- 定义上传文件属性 -->
	<constant name="struts.mulitipart.maxSize" value="40000000"></constant>
	<package name="px" extends="struts-default,json-default" namespace="/">
		<!-- 启动拦截器 -->
		<!-- <default-interceptor-ref name="myStack"/> -->
		<!--上传方法配置 -->
		<action name="fileup_*" class="com.yc123.action.UploadFileAction" method="{1}">
			<!-- 配置上传文件类型 -->
			<interceptor-ref name="fileUpload">
				<param name="allowedTypes">text/plain,,image/jpg,image/jpeg,image/gif,image/png,image/bmp,image/pjpeg</param>
			</interceptor-ref>
			<interceptor-ref name="defaultStack"/>
			<result name="success">/index.jsp</result>
			<result name="showListPath">/index.jsp</result>
		</action>
		<!-- 下载文件配置 -->
		<action name="downMyFile" class="com.yc123.action.UploadFileAction">
			<result name="success" type="stream">
				<!-- 配置方法名称 -->
				<!-- inputName必须与action类中的getMyfile()相同 -->
				<param name="inputName">myfile</param>
				<param name="contentDisposition">attachment;filename=${dfName}</param>
				<!-- 设置缓存区大小 -->
				<param name="bufferSize">1024</param>
			</result>
		</action>
		
	</package>
</struts>    

最后,我中页面上对之前写的方法进行调用
<body>
    <form action="fileup_saveFile.action" method="post" enctype="multipart/form-data">
    	上传文件:<input type="file" name="upload">
    	<input type="submit" value="上传">
    </form>
    <hr/>
    	下载文件:<a href="fileup_showFilePath.action">显示文件列表</a>
    <c:forEach items="${list }" var="li">
    	<a href="downMyFile.action?dfName=${li }">${li }</a>
    </c:forEach>
  </body>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值