转眼过去俩月了,我的学习进度也从初始的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>