struts2文件上传和下载
2017-05-19 18:27
363 查看
struts2中把文件上传和下载功能都做了封装,使得我们使用起来很简单,今天这篇博客就介绍struts2框架中文件的上传和下载功能,分别是单个文件上传,多文件上传,文件下载,文件下载写了两种方式,读者朋友们可以选择适合自己的使用,在写的过程中,如果有写 的不对的地方,或者是解释的不清楚的地方,欢迎朋友们留言批评指正!!
2、配置struts.xml为:
3、uploadAction代码是:
其中关于下图中的UploadAction类中属性,上传的文件名和上传的MIME类型为什么必须那么些,是因为在struts2的源码中规定只能那么写,
下面截取struts2中的文件上传的拦截器FileUploadInteceptor,来说明UploadAction中文件名和MIME类型那么写的原因:
如图所示,上传文件需要的文件名称和MIME类型,规定为表单中inputName字符串+“ContentType”和“FileName”,所以我们在UploadAction中只能那么写。
上传成功结果:
2、配置struts.xml为:
3、uploadAction代码是:
4、成功结果打印
1、新建download.jsp文件:
2、配置struts.xml文件:
3、新建下载action类:
注意:上面的
4、下载弹出框:
项目展示:
web.xml配置文件代码:
index.jsp文件代码:
DownloadAction.java代码:
struts.xml配置文件代码:
点击下载页面的连接截图:
一、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>
3、新建下载action类:
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>
index.jsp文件代码:
<%@ 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>
点击下载页面的连接截图:
相关文章推荐
- struts2学习笔记(11)——struts2文件上传与下载
- struts2文件上传下载
- struts2 文件上传和下载,以及部分源码解析
- Struts2 多文件上传下载
- Struts2之实现文件上传与下载
- Struts2学习笔记16:Struts2的文件上传和下载【续】三
- Struts2文件的上传和下载
- Struts2文件的上传和下载
- Struts2文件上传和下载
- Struts2文件的上传和下载
- Struts2文件的上传和下载
- struts2文件的上传和下载功能
- Struts2 多个文件上传和下载(支持中文文件名)
- 【原创】Struts2学习笔记之文件的上传与下载
- Struts2学习笔记13:Struts2的文件上传和下载
- Struts2文件上传与下载
- Struts2学习笔记14:Struts2的文件上传和下载【续】
- [转载] 第六章 struts2文件上传与下载
- Struts2文件上传与下载
- struts2 文件上传与下载原理