国庆七篇-----struts2的文件上传下载(一)
struts2提供了文件的上传下载功能,不过需要我们对其提供相关的文件参数。
比如文件上传,必须提供三种属性,并对其提供setter和getter方法,而且必须按照以下规范命名:
private File XXX;
private String XXXFileName;
private String XXXContentType;
注意:必须是上面的格式,即XXX,XXX+FileName,XXX+ContentType。如果不是上面的形式,拦截器不会对其赋值。
下面是代码:(MyFileUpload.java)
package com.hncj.edu;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class MyFileUpload extends ActionSupport{
private File upload;
private String uploadFileName;
private String uploadContentType; //三种属性格式固定
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;
}
public String executeUpload() {
String realPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/upload");
File uploadDir = new File(realPath);
if(!uploadDir.exists()) {
uploadDir.mkdir();
}
try {
//复制文件调用copyFile就行了
FileUtils.copyFile(upload, new File(realPath+File.separator+uploadFileName));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "success";
}
}
上传视图:(upload.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:actionerror/>
<s:form action="upload" method="post" enctype="multipart/form-data">
<s:file name="upload" label="请选择文件"></s:file>
<s:submit label="提交"/>
</s:form>
</body>
</html>
上传成功后跳转到下载视图,显示所有可以下载的文件:(result.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
//页面中发出list.action请求,在showFileItems.jsp页面中显示所有文件项,并将showFileItems.jsp的内容显示在result.jsp页面中
<s:action name="list" executeResult="true"/>
</body>
</html>
showFileItems.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table>
<s:iterator var="item" value="fileNames">
<tr>
<td>${item}</td>
<td>
//这里要用url标签,不然传递中文文件名会报错
<s:url var="url" value="download">
<s:param name="fileName">${item}</s:param>
</s:url>
//使用上面url标签定义的值
<s:a href="%{#url}">下载</s:a>
</td>
</tr>
</s:iterator>
</table>
<s:debug></s:debug>
</body>
</html>
显示文件项的Action:(ListAllFiles.java)
package com.hncj.edu;
import java.io.File;
import org.apache.struts2.ServletActionContext;
public class ListAllFiles {
private String[] fileNames;
public String[] getFileNames() {
return fileNames;
}
public void setFileNames(String[] fileNames) {
this.fileNames = fileNames;
}
public String listFiles() {
String realPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/upload");
File dir = new File(realPath);
//获取上传目录下所有文件的文件名
fileNames = dir.list();
return "success";
}
}
下载的action:(MyFileDownload.java)
文件下载必须要提供对应文件的输入流,为其赋值,并提供get方法。
package com.hncj.edu;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
public class MyFileDownload {
private InputStream input; //必须的
private String fileName; //还可以提供ContentType,ContentLength等属性
public InputStream getInput() {
return input;
}
public void setInput(InputStream input) {
this.input = input;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String execute() {
this.input = ServletActionContext.getServletContext().getResourceAsStream("/WEB-INF/upload"+"/"+fileName);
return "success";
}
}
strust.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="true"/>
<package name="pack1" extends="struts-default">
<action name="upload" class="com.hncj.edu.MyFileUpload" method="executeUpload">
<interceptor-ref name="defaultStack">
<!--限制文件上传的大小-->
<param name="fileUpload.maximumSize">102400</param>
<!--限制文件的后缀名-->
<param name="fileUpload.allowedExtensions">.txt</param>
<!--还可以限制文件的类型-->
<param name="fileUpload.allowedTypes>image/jpeg<param>
</interceptor-ref>
<result name="success">result.jsp</result>
<result name="input">upload.jsp</result>
</action>
<action name="list" class="com.hncj.edu.ListAllFiles" method="listFiles">
<result>showFileItems.jsp</result>
</action>
<action name="download" class="com.hncj.edu.MyFileDownload">
<result type="stream">
<!--inputName要和action中的输入流名字相同-->
<param name="inputName">input</param>
<!--设置下载方式打开-->
<param name="contentDisposition">attachment;filename=${fileName}</param>
<!--设置缓冲区大小-->
<param name="bufferSize">4096</param>
</result>
</action>
</package>
</struts>
运行结果: