struts2中把文件上传和下载功能都做了封装,使得我们使用起来很简单,今天这篇博客就介绍struts2框架中文件的上传和下载功能,分别是单个文件上传,多文件上传,文件下载,文件下载写了两种方式,读者朋友们可以选择适合自己的使用,在写的过程中,如果有写 的不对的地方,或者是解释的不清楚的地方,欢迎朋友们留言批评指正!!
一、struts2文件上传的demo
1、新建一个upload.jsp文件:
<s:form action="uploadOne" method="post" enctype="multipart/form-data">
<s:textfield name="username" label="用户名"/>
<s:file name="photo" label="照片"/>
<s:submit value="上传"/>
</s:form>
2、配置struts.xml为:
<action name="uploadOne" class="com.struts.user.action.UploadAction" method="uploadOne">
<result name="success">/welcome_user.jsp</result>
</action>
3、uploadAction代码是:
package com.struts.user.action;
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 UploadAction extends ActionSupport {
private String username;
private File photo;//表单中的文件名称,这里暂时称为inputName
private String photoFileName;// 上传的文件名:上面的inputName+"FileName",必须这么写
private String photoContentType;// 上传的文件的MIME类型:上面的inputName+“ContentType”,必须这么写
public String uploadOne() throws IOException {
System.out.println("username = " + username + "\nphotoName = " + photoFileName + "\nphotoContentType = "
+ photoContentType);
// 上传
String storeDir = ServletActionContext.getServletContext().getRealPath("/upload");
FileUtils.copyFile(photo, new File(storeDir, photoFileName));
return SUCCESS;
}
public String getPhotoFileName() {
return photoFileName;
}
public void setPhotoFileName(String photoFileName) {
this.photoFileName = photoFileName;
}
public String getPhotoContentType() {
return photoContentType;
}
public void setPhotoContentType(String photoContentType) {
this.photoContentType = photoContentType;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public File getPhoto() {
return photo;
}
public void setPhoto(File photo) {
this.photo = photo;
}
}
其中关于下图中的UploadAction类中属性,上传的文件名和上传的MIME类型为什么必须那么些,是因为在struts2的源码中规定只能那么写,
下面截取struts2中的文件上传的拦截器FileUploadInteceptor,来说明UploadAction中文件名和MIME类型那么写的原因:
如图所示,上传文件需要的文件名称和MIME类型,规定为表单中inputName字符串+“ContentType”和“FileName”,所以我们在UploadAction中只能那么写。
上传成功结果:
二、多文件上传demo
1、新建一个upload.jsp文件:
<s:form action="uploadOne" method="post" enctype="multipart/form-data">
<s:textfield name="username" label="用户名"/>
<s:file name="photo" label="照片1"/>
<s:file name="photo" label="照片2"/>
<s:file name="photo" label="照片3"/>
<s:submit value="上传"/>
</s:form>
2、配置struts.xml为:
<?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>
<package name="user" namespace="/" extends="struts-default">
<action name="uploadOne" class="com.struts.user.action.UploadAction" method="uploadOne">
<result name="success">/welcome_user.jsp</result>
</action>
</package>
</struts>
3、uploadAction代码是:
package com.struts.user.action;
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 UploadAction extends ActionSupport {
private String username;
private File[] photo;
private String[] photoFileName;// 上传的文件名
private String[] photoContentType;// 上传的文件的MIME类型
public String uploadOne() throws IOException {
System.out.println("username = " + username + "\nphotoName = " + photoFileName + "\nphotoContentType = "
+ photoContentType);
// 上传
String storeDir = ServletActionContext.getServletContext().getRealPath("/upload");
if (photo != null && photo.length > 0) {
for (int i = 0; i < photo.length; i++) {
FileUtils.copyFile(photo[i], new File(storeDir, photoFileName[i]));
}
}
return SUCCESS;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public File[] getPhoto() {
return photo;
}
public void setPhoto(File[] photo) {
this.photo = photo;
}
public String[] getPhotoFileName() {
return photoFileName;
}
public void setPhotoFileName(String[] photoFileName) {
this.photoFileName = photoFileName;
}
public String[] getPhotoContentType() {
return photoContentType;
}
public void setPhotoContentType(String[] photoContentType) {
this.photoContentType = photoContentType;
}
}
4、成功结果打印
三、文件下载
这篇博客中写两个下载的项目,都可以,下面先写第一个:
项目一:
项目展示 :
1、新建download.jsp文件:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<s:a action="download?filename=1.jpg">1.jpg
</s:a>
<br>
<s:a action="download?filename=2.jpg">2.jpg</s:a>
<br>
<s:a action="download?filename=3.jpg">3.jpg</s:a>
<br>
</body>
</html>
2、配置struts.xml文件:
<?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>
<package name="user" namespace="/" extends="struts-default">
<action name="download" class="com.struts.user.action.DownloadAction">
<result name="success" type="stream">
<!-- 设置文件名称的MIME类型,值不是固定的,值是动态的 -->
<param name="ContentType">${contentType}</param>
<!-- 设置弹出下载的窗口,文件名称是动态的值 , -->
<!-- 这里的${downloadFilename}是从DownloadAction类中的getDownloadFilename()方法中获得文件名,
浏览器中下载的弹出框中展示的就是这个名字 -->
<param name="ContentDisposition">attachment;filename=${downloadFilename}</param>
</result>
</action>
</package>
</struts>
package com.struts.user.action;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import sun.misc.BASE64Encoder;
public class DownloadAction extends ActionSupport{
//接受文件的名称
private String filename;
/*
* get请求的中文乱码问题需要自己解决
*/
public void setFilename(String filename) throws UnsupportedEncodingException{
this.filename = new String(filename.getBytes("ISO-8859-1"),"UTF-8");
}
/*
* 提供一个方法,能获取的文件的MIME类型
*/
public String getContentType(){
return ServletActionContext.getServletContext().getMimeType(filename);
}
/*
* 返回的是文件的名称
* 在弹出的下载窗口中,显示中文会有乱码的问题
* 判断浏览器,根据不同的编码解决乱码的问题
*/
public String getDownloadFilename() throws IOException{
// 先获取user-agent头信息
String agent = ServletActionContext.getRequest().getHeader("user-agent");
// 调用该方法,编码
String name = this.encodeDownloadFilename(filename, agent);
return name;
}
/*
* 根据user-agent的头,和文件的名称,解决中文文件名编码的问题
*/
public String encodeDownloadFilename(String filename, String agent) throws IOException{
if(agent.contains("Firefox")){ // 火狐浏览器
filename = "=?UTF-8?B?"+new BASE64Encoder().encode(filename.getBytes("utf-8"))+"?=";
}else{ // IE及其他浏览器
filename = URLEncoder.encode(filename,"utf-8");
}
return filename;
}
/*
* 提供一个方法名称必须是getInputStream()方法
*/
public InputStream getInputStream(){
// 获取要下载的文件的输入流,返回
return ServletActionContext.getServletContext().getResourceAsStream("/upload/"+filename);
}
@Override
public String execute() throws Exception{
return SUCCESS;
}
}
public InputStream getInputStream(){
// 获取要下载的文件的输入流,返回
return ServletActionContext.getServletContext().getResourceAsStream("/upload/"+filename);
}
这个方法中的upload下面一定要有您下载的文件的,且名字相同,负责会报错
4、下载弹出框:
项目二:
项目展示:
web.xml配置文件代码:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<s:a action="download.action?fileName=1.jpg">download1</s:a>
</body>
</html>
DownloadAction.java代码:
package com.robert.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
public class DownloadAction {
private String fileName;
public String execute() {
return Action.SUCCESS;
}
public InputStream getInputStream() throws FileNotFoundException {
HttpServletRequest req = ServletActionContext.getRequest();
String path = req.getRealPath("/download");
return new FileInputStream(new File(path, fileName));
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
struts.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="default" namespace="/" extends="struts-default">
<action name="download" class="com.robert.action.DownloadAction">
<result type="stream">
<param name="contentDisposition">attachment;filename=${fileName}</param>
</result>
</action>
</package>
</struts>
点击下载页面的连接截图: