7、Struts2实现文件上传和下载
一、实现单个文件上传
1、创建如下web项目结构
2、在src下的com.action包下创建UploadAction.java
package com.action;
import java.io.File; import javax.servlet.ServletContext; import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; /**
* 单个文件上传
* @author Dell
*
*/
public class UploadAction extends ActionSupport {
//封装上传文件属性==form表单中file文件域的name属性值保持一致
private File upload; //封装上传文件的类型,固定语法=file文件域name属性值+ContextType;
private String uploadContentType; //封装文件上传名,固定语法=file文件域name属性值+FileName
private String uploadFileName; @Override
public String execute() throws Exception {
//获取上下文对象
ServletContext appliaction=ServletActionContext.getServletContext();
//获取要保存文件的位置
String path=appliaction.getRealPath("/upload");
//创建一个与上传同名的文件
File file=new File(path,uploadFileName);
//将临时文件内容拷贝到目标文件夹下的那个同名的文件
FileUtils.copyFile(upload, file);
//删除临时文件
upload.delete();
return SUCCESS;
} public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
} }
UploadAction.java
3、在src下创建struts.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" >
<struts>
<!-- 中文乱码处理 -->
<constant name="struts.i18n.encoding" value="UTF-8"/> <constant name="struts.devMode" value="true"/>
<!-- 设置上传文件的总大小 -->
<constant name="struts.multipart.maxSize" value="200000000"/> <package name="default" namespace="/" extends="struts-default">
<!--文件上传 -->
<action name="*" class="com.action.{1}Action" method="execute">
<result>/success.jsp</result>
<result name="input">/error.jsp</result>
<interceptor-ref name="defaultStack">
<!-- 配置文件上传的大小,这里配置的是上传文件的单个大小 -->
<param name="fileUpload.maximumSize">20971520</param> <!-- 配置文件上传允许的类型 -->
<param name="fileUpload.allowedTypes">text/plain,application/msword</param> <!-- 配置文件的扩展名 -->
<param name="fileUpload.allowedExtensions">.txt,.doc</param>
</interceptor-ref>
</action> </package>
</struts>
struts.xml
4、在WebRoot下创建upload文件夹
5、编辑WebRoot下的WEB-INF下的web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<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> <welcome-file-list>
<welcome-file>upload.jsp</welcome-file>
</welcome-file-list> </web-app>
web.xml
6、在WebRoot下创建upload.jsp文件
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri= "/struts-tags" prefix="s" %>
<%
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>单个文件上传</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:form action="Upload.action" enctype="multipart/form-data" method="post">
<s:textfield name="title" label="标题"/><br/>
<s:file name="upload" label="选择文件"/><br/>
<s:submit name="submit" value="上传文件"/>
</s:form>
</body>
</html>
upload.jsp
7、在WebRoot下创建success.jsp文件
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
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:property value="uploadFileName"/><br/>
文件类型:<s:property value="uploadContentType"/><br/>
</body>
</html>
success.jsp
8、在WebRoot下创建error.jsp文件
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
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 'MyJsp.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>
操作失败!!
</body>
</html>
error.jsp
9、运行
二、上传多个文件
(接着上面的项目进行)
1、在src的com.action包下创建ManyUploadAction.java
package com.action;
import java.io.File; import javax.servlet.ServletContext; import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; /**
* 多个文件上传
* @author Dell
*
*/
public class ManyUploadAction extends ActionSupport {
//封装上传文件属性==form表单中file文件域的name属性值保持一致
private File[] upload; //封装上传文件的类型,固定语法=file文件域name属性值+ContextType;
private String[] uploadContentType; //封装文件上传名,固定语法=file文件域name属性值+FileName
private String[] uploadFileName; @Override
public String execute() throws Exception {
//获取上下文对象
ServletContext appliaction=ServletActionContext.getServletContext();
//获取要保存文件的位置
String path=appliaction.getRealPath("/upload");
for (int i = 0; i < upload.length; i++) { //创建一个与上传同名的文件
File file=new File(path,uploadFileName[i]);
//将临时文件内容拷贝到目标文件夹下的那个同名的文件
FileUtils.copyFile(upload[i], file);
//删除临时文件
upload[i].delete();
}
return SUCCESS;
} public File[] getUpload() {
return upload;
} public void setUpload(File[] upload) {
this.upload = upload;
} public String[] getUploadContentType() {
return uploadContentType;
} public void setUploadContentType(String[] uploadContentType) {
this.uploadContentType = uploadContentType;
} public String[] getUploadFileName() {
return uploadFileName;
} public void setUploadFileName(String[] uploadFileName) {
this.uploadFileName = uploadFileName;
} }
ManyUploadAction.java
2、在WebRoot下创建manyUpload.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri= "/struts-tags" prefix="s" %>
<%
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>多个文件上传</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:form action="ManyUpload.action" enctype="multipart/form-data" method="post">
<s:file name="upload" label="选择文件1"/><br/>
<s:file name="upload" label="选择文件2"/><br/>
<s:file name="upload" label="选择文件3"/><br/>
<s:file name="upload" label="选择文件4"/><br/>
<s:file name="upload" label="选择文件5"/><br/>
<s:submit name="submit" value="上传文件"/><br/>
</s:form>
</body>
</html>
manyUpload.jsp
3、运行
三、文件下载
(接着上面的项目进行)
1、在src下的com.action包下创建FileDownAction.java
package com.action; import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; /**
* 文件下载
* @author Dell
*
*/
public class FileDownAction extends ActionSupport{
//读取下载文件的目录
private String inputPath;
//下载文件的文件名
private String fileName;
//读取下载文件的输入流
private InputStream inputStream;
//下载文件的类型
private String contentType; @Override
public String execute() throws Exception {
return SUCCESS;
} public String getInputPath() {
return inputPath;
}
public void setInputPath(String inputPath) {
this.inputPath = inputPath;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
//创建InputStream输入流
public InputStream getInputStream() throws FileNotFoundException {
//得到下载文件的实际路径
String path=ServletActionContext.getServletContext().getRealPath(inputPath);
//创建输入流实现文件的下载读取
return new BufferedInputStream(new FileInputStream(path+"\\"+fileName));
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
} }
FileDownAction.java
2、编辑src下的struts.xml文件(添加文件下载的action的内容)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "struts-2.1.7.dtd" >
<struts>
<!-- 中文乱码处理 -->
<constant name="struts.i18n.encoding" value="UTF-8"/> <!-- 设置开发模式 -->
<constant name="struts.devMode" value="true"/> <!-- 设置上传文件的大小 -->
<constant name="struts.multipart.maxSize" value="200000000"/> <package name="default" namespace="/" extends="struts-default">
<!-- 文件上传 -->
<action name="*" class="com.action.{1}Action" method="execute">
<result>/success.jsp</result>
<result name="input">/error.jsp</result>
<!-- 引用默认拦截器栈 -->
<interceptor-ref name="defaultStack">
<!-- 配置上传的大小,这里配置的是上传文件的单个大小 -->
<param name="fileUpload.maximumSize">20971520</param>
<!-- 配置文件上传允许的类型 -->
<!-- 图片:image/pjpeg,image/jpeg,image/gif,image/png,image/bmp -->
<!-- 文本文件:text/plain -->
<!-- HTML网页:text/html -->
<!-- 可执行文件:application/octet-stream -->
<!-- PPT:Application/vnd.ms-powerpoint -->
<!-- Excel:Application/vnd.ms-excel -->
<!-- Word:application/msword -->
<param name="fileUpload.allowedTypes">text/plain,application/msword</param>
<!-- 配置文件的扩展名 -->
<param name="fileUpload.allowedExtensions">.txt,.doc</param> </interceptor-ref>
</action> <!-- 文件下载 -->
<action name="download" class="com.action.FileDownAction" method="execute">
<!-- 配置action中使用的参数-->
<param name="inputPath">/upload</param> <result name="success" type="stream">
<!--设置浏览器的文件类型 -->
<param name="contentType">application/octet-stream</param>
<!-- 输入流,读取 -->
<param name="inputStream">inputStream</param>
<!--设置http响应的头 -->
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<!-- 设置缓冲区大小 -->
<param name="bufferSize">4096</param>
</result>
</action>
</package>
</struts>
struts.xml
3、在WebRoot下创建down.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri= "/struts-tags" prefix="s" %>
<%
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>文件下载</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>
<a href="download.action?fileName=20140914.txt">点击此处下载20140914.txt文档</a> </body>
</html>
down.jsp
4、运行
7、Struts2实现文件上传和下载的更多相关文章
- struts2实现文件上传和下载
在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来 ...
- Struts2的文件上传与下载
<一>简述: Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置,<interceptor name="fileUp ...
- 【Struts2】文件上传与下载
一.上传 1.1 Struts2实现步骤 浏览器端 服务器端 1.2 关于Struts2中文件上传细节: 1.3 示例 jsp文件 Action类 struts.xml文件配置 二.下载 2.1 文件 ...
- (十五)struts2的文件上传和下载
文件上传的原理 我们以前学习上传的时候知道需要将表单的enctype属性设置为multipart/form-data. 表单的enctype属性指定的是表单数据的编码方式,有三个值: -applica ...
- Struts2之文件上传与下载
时间:2017-1-11 15:47 --使用commons-fileupload组件上传1.客户端 * method="post" * <input t ...
- 11、Struts2 的文件上传和下载
文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...
- Struts2入门(七)——Struts2的文件上传和下载
一.前言 在之前的随笔之中,我们已经了解Java通过上传组件来实现上传和下载,这次我们来了解Struts2的上传和下载. 注意:文件上传时,我们需要将表单提交方式设置为"POST" ...
- Struts2 实现文件上传和下载
实现上传功能 Struts2实际上是使用的commons fileupload 组件,所以记得导包哦. 1.首先你应该有一个上传页面 <!-- file的name属性与action中的File类 ...
- struts2(六) 文件上传和下载
前面对文件下载提过一点点,这里正好要讲文件上传,就放在一起在说一遍. --WH 一.单文件上传 在没学struts2之前,我们要写文件上传,非常麻烦,需要手动一步步去获取表单中的各种属性,然后在进行相 ...
随机推荐
- [SQL基础教程] 4-1 数据的插入(INSERT)
[SQL基础教程] C4 数据更新 4-1 数据的插入(INSERT) INSERT INSERT INTO <表名>(列1,列2...) VALUES(值1,值2...); 清单 用() ...
- [MFC美化] Skin++使用详解-使用方法及注意事项
主要分为以下几个方面: 1.Skin++使用方法 2.使用中注意事项 一. Skin++使用方法 SkinPPWTL.dll.SkinPPWTL.lib.SkinPPWTL.h ,将三个文件及相应皮肤 ...
- IMacro 脚本简记
抓取速卖通纠纷订单详情,生成csv进行统计. var macro1="CODE:";macro1+="VERSION BUILD=8970419 RECORDER=FX& ...
- [SOJ] 畅通工程续
Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多 ...
- Linux_jdk
先查看下 yum list java* yum install java-1.7.0-openjdk* -y 环境变量应该是会自动配置的 或者手动配置编辑/etc/profile #vi /etc/p ...
- abap 一些小知识点的总结
创建包含结构或表的内表: DATA: BEGIN OF it_tab. INCLUDE TYPE/STRUCTURE name. name:结构名或者表名 DATA: num TY ...
- eclipse 使用问题
eclipse 启动失败,错误信息为org.eclipse.swt.SWTException: Failed to execute runnable 方法三:删除了workspace\.metadat ...
- NSCondition用法
NSCondition用法 使用NSCondition,实现多线程同步...举个列子 消费者跟生产者... 现在传言6s要出了.. 消费者想买6s.现在还没有6s.消费者等待6s生产. 生产了一个产品 ...
- mybatis配置sql超时时间
mybatis如果不配置,默认超时时间是不做限制的.当系统慢sql很多时,势必会增加数据库压力,系统性能及稳定性降低.所以有必要要设置sql超时设置,下面配置超时时间是5分钟. 第一步:全局配置如下 ...
- C primer plus 第五版十二章习题
看完C prime plus(第五版)第十二章,随带完成了后面的习题. 1.不使用全局变量,重写程序清单12.4的程序. 先贴出12.4的程序,方便对照: /* global.c --- 使用外部变量 ...