实现使用Struts2文件上传和文件下载:

  注意点:

     (1)对应表单的file1和私有成员变量的名称必须一致

        <input type="file" name="file1"/>

            private File file1;

      (2)限制上传文件大小和类型的格式是定死的,最好记住,记不住知道去哪里查;虽然不做要求,完全懂框架内部的机制,但是找一些东西还是需要能找到的,这样你可以很好的实现一些功能,因为这些关键字都是框架底层定义好的,图一是找到配置上传文件大小的关键字,图二是找到设置文件类型的关键字。


1:第一步,引入核心包,省略;

2:在web.xml配置过滤器,如下所示:

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>struts2_upload20170306</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <!-- 其他过滤器 --> <!-- 引入struts2的核心过滤器 -->
<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>

3:创建上传文件的页面uploadfile.jsp,源码如下所示:

需要注意form标签需要引入这句:enctype="multipart/form-data"

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>上传文件的页面</title>
</head>
<body> <form action="${pageContext.request.contextPath }/fileUploadAction" method="post" enctype="multipart/form-data">
文件名:<input type="text" name="filename"/><br/>
文件:<input type="file" name="file1"/><br/>
<input type="submit" value="上传文件">
</form>
</body>
</html>

4:开发action,实现对文件上传后台的处理:已经加了详细的注释,需要注意的地方都加了注释;

 package com.bie.upload;

 import java.io.File;

 import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; /**
* @author BieHongLi
* @version 创建时间:2017年3月6日 上午10:43:52
* 上传文件的Action处理
*
* struts2文件上传
* 1:struts2中文件上传拦截器帮助我们完成上传文件的功能;
*
*
*/
public class UploadAction extends ActionSupport{ private static final long serialVersionUID = 1L;
//对应表单的file1 <input type="file" name="file1"/>
private File file1;
//当前上传的文件名
private String file1FileName;
//文件类型(MIME)
private String file1ContentType;
public void setFile1(File file1) {
this.file1 = file1;
}
public void setFile1FileName(String file1FileName) {
this.file1FileName = file1FileName;
}
public void setFile1ContentType(String file1ContentType) {
this.file1ContentType = file1ContentType;
} @Override
public String execute() throws Exception {
//开始拿到上传的文件,进行处理,上传之前,要创建一个upload目录
System.out.println("测试上传的文件");
//把文件上传到upload目录,获取上传的目录路径
String path=ServletActionContext.getServletContext().getRealPath("/upload");
//创建目标文件对象,文件名file1FileName,格式_FileName
File destFile=new File(path,file1FileName);
//把上传的文件,拷贝到目标文件中
FileUtils.copyFile(file1, destFile); return SUCCESS;
} }

5:由于练习阶段,需要很多测试,所以为了方便,特别引入了全局配置,总配置文件和各个项目的配置文件,下面是源码:

在全局配置文件中实现限制上传文件的大小,在分配置文件中实现限制上传文件的类型;

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<!-- 声明包 -->
<package name="fileuploadpackage" extends="struts-default">
<!-- 定义action -->
<action name="fileUploadAction" class="com.bie.upload.UploadAction">
<!-- 显示成功的jsp页面 -->
<result name="success">/uploadfile/success.jsp</result> <!-- 文件上传拦截器,限制运行上传的文件的类型,还有其他一个方法,这是其中一个 -->
<interceptor-ref name="defaultStack">
<!-- 限制运行的文件的扩展名 fileUpload.allowedExtensions固定写法-->
<param name="fileUpload.allowedExtensions">txt,jpg,gif,png</param>
</interceptor-ref> <!-- 错误提示,档文件上传出现错误的时候,struts内部会返回input视图,
错误视图,所以就需要我们在struts.xml中配置Input视图对应的错误页面 -->
<result name="input">/uploadfile/error.jsp</result> </action>
</package>
</struts>
 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<!-- 一:全局配置 --> <!-- 修改上传文件的最大大小为30M -->
<constant name="struts.multipart.maxSize" value="31457280"></constant> </struts>
 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<!-- 一:Struts2的全局配置,必须写在最上面,格式如下所示 -->
<include file="constant.xml"></include> <!-- 二:总配置文件,引入其他所有配置文件 -->
<include file="com/bie/upload/fileupload.xml"></include> </struts>

6:最后完成成功页面和错误页面的跳转,源码如下所示:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>成功的页面</title>
</head>
<body>
成功的页面
</body>
</html>
 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>成功的页面</title>
</head>
<body>
error.jsp
<!-- 查询struts2在运行期间产生的所有错误信息 -->
<%@ taglib prefix="s" uri="/struts-tags"%>
<s:fielderror></s:fielderror>
</body>
</html>

演示效果如下所示:分别演示了限制不符合文件类型的上传和符合文件类型的上传


struts2实现文件的下载是在上面上传的基础上完成的,所以直接写下载的代码:

1:实现文件的下载,首先创建一个list.jsp页面,用于展示文件,源码如下所示:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>下载的页面</title>
</head>
<body> <center>
<table cellpadding="10" cellspacing="10">
<tr>
<td>编号</td>
<td>文件名</td>
<td>操作</td>
</tr>
<c:forEach items="${fileNames }" var="fileName" varStatus="fn">
<tr>
<td>${fn.count}</td>
<td>${fileName }</td>
<td>
<!-- 构建一个ur -->
<c:url var="url" value="down_down">
<c:param name="fileName" value="${fileName }"></c:param>
</c:url>
<a href="${url }">下载</a>
</td>
</tr>
</c:forEach>
</table> </center>
</body>
</html>

2:然后开发Action,创建一个文件DownActin.java,源码如下所示:

 package com.bie.upload;

 import java.io.File;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; /**
* @author BieHongLi
* @version 创建时间:2017年3月6日 下午1:54:00
* 文件下载的2种方式:
* 方式1:通过response对象向浏览器写入字节流数据,设置下载的响应头
* 方式2:struts的方式
*/
public class DownAction extends ActionSupport{ private static final long serialVersionUID = 1L; //第一步:显示所有要下载的文件的列表
public String list() throws Exception {
//1:得到upload目录路径
String path=ServletActionContext.getServletContext().getRealPath("/upload");
//2:目录对象
File file=new File(path);
//3:得到所有要下载的文件的文件名
String[] fileNames=file.list();
//4:保存
ActionContext ac=ActionContext.getContext();
//5:得到代表request的Map(第二种方式)
Map<String,Object> request=(Map<String,Object>)ac.get("request"); request.put("fileNames", fileNames);
return "list";
} //*************2:文件下载************************/
//2.1:获取要下载的文件的文件名,设置字符集,前台页面提交的是以get方式提交的
private String fileName;
public void setFileName(String fileName) {
//处理传入的参数种问题(get提交)
try {
fileName=new String(fileName.getBytes("ISO8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException();
}
//把处理好的文件名,赋值
this.fileName = fileName;
} //2.2:下载提交的业务方法(在struts.xml中配置返回stream)
public String down() throws Exception {
return "download";
} //2.3:返回流的方法
public InputStream getAttrInputStream(){
return ServletActionContext.getServletContext().getResourceAsStream("/upload/"+fileName);
} //2.4:下载显示的中文名,(浏览器显示的文件名)
public String getDownFileName(){
try{
//import java.net.URLEncoder;
fileName = URLEncoder.encode(fileName,"UTF-8");
}catch(Exception e){
throw new RuntimeException();
} return fileName;
}
}

3:接着配置struts.xml的分文件fileupload.xml,配置如下所示:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<!-- 声明包 -->
<package name="fileuploadpackage" extends="struts-default">
<!-- 定义action -->
<action name="fileUploadAction" class="com.bie.upload.UploadAction">
<!-- 显示成功的jsp页面 -->
<result name="success">/uploadfile/success.jsp</result> <!-- 文件上传拦截器,限制运行上传的文件的类型,还有其他一个方法,这是其中一个 -->
<interceptor-ref name="defaultStack">
<!-- 限制运行的文件的扩展名 fileUpload.allowedExtensions固定写法
allowedExtensions找到allowedExtensionsSet去掉set即可-->
<param name="fileUpload.allowedExtensions">txt,jpg,gif,png</param>
</interceptor-ref> <!-- 错误提示,档文件上传出现错误的时候,struts内部会返回input视图,
错误视图,所以就需要我们在struts.xml中配置Input视图对应的错误页面 -->
<result name="input">/uploadfile/error.jsp</result> </action> <!-- 下载的action -->
<action name="down_*" class="com.bie.upload.DownAction" method="{1}">
<!-- 列表展示 -->
<result name="list">/uploadfile/list.jsp</result> <!-- 下载操作 -->
<result name="download" type="stream">
<!-- 允许下载的文件的类型:指定为所有的二进制的文件类型,去tomcat的wen.xml里面搜索.exe -->
<param name="contentType">application/octet-stream</param>
<!-- 对应的就是Action种的属性,返回流的属性,【其实就是getAttrInputStream()】 -->
<param name="inputName">attrInputStream</param>
<!-- 下载头,包括:浏览器显示的文件名 -->
<param name="contentDisposition">attachment;filename="${downFileName}"</param>
<!-- 缓冲区大小设置 -->
<param name="bufferSize">1024</param>
</result> </action>
</package>
</struts>

演示效果如下图所示:


下面简单说一下如何找一些配置或者定义好的文件名:

对于框架的要求,不需要研究底层,当然你有精力,可以去研究,对于一个又一个新的框架的产生,我感觉个人能熟练应用和知道底层是如何工作的以及底层的定义名词,这就足够了。

1:首先应该会找到struts-default.xml这个文件,以及配置文件里面的一些配置,如这次使用下载文件所使用的stream流api里面的案例:

2:这次上传文件所使用的过滤器,你也应该能找到,这样才可以会用他们定义好的属性:

革命尚未成功,别先生仍需努力啊!!!

struts2的文件上传和文件下载的更多相关文章

  1. 分享知识-快乐自己:Struts2文件上传及文件下载

    1)Struts2单文件上传 action:类文件 package com.mlq.action; import com.opensymphony.xwork2.ActionSupport; impo ...

  2. struts2的文件上传

    在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来 ...

  3. struts2实现文件上传和下载

    在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来 ...

  4. Struts2的文件上传与下载

    <一>简述: Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置,<interceptor name="fileUp ...

  5. 【Struts2】文件上传与下载

    一.上传 1.1 Struts2实现步骤 浏览器端 服务器端 1.2 关于Struts2中文件上传细节: 1.3 示例 jsp文件 Action类 struts.xml文件配置 二.下载 2.1 文件 ...

  6. (十五)struts2的文件上传和下载

    文件上传的原理 我们以前学习上传的时候知道需要将表单的enctype属性设置为multipart/form-data. 表单的enctype属性指定的是表单数据的编码方式,有三个值: -applica ...

  7. Struts2之文件上传与下载

    时间:2017-1-11 15:47 --使用commons-fileupload组件上传1.客户端    *   method="post"    *   <input t ...

  8. jsp\struts1.2\struts2 中文件上传(转)

    jsp\struts1.2\struts2 中文件上传 a.在jsp中简单利用Commons-fileupload组件实现 b.在struts1.2中实现c.在sturts2中实现现在把Code与大家 ...

  9. Struts2+Uploadify文件上传使用详解

    Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.不过官方提供的实例是php版本的,本文将详细介绍Uploadify在java中的使用,您也可以点击下面的链接进行演示或下 ...

随机推荐

  1. 【JUC】CountDownLatch

    因为在调用端的异步中,需要调用其他多个服务获取数据再汇总结果返回,所以用到了CountDownLatch CountDownLatch的概念 CountDownLatch是一个同步工具类,用来协调多个 ...

  2. 转---python os.exec*()家族函数的用法

    execl(file, arg0,arg1,...) 用参数列表arg0, arg1 等等执行文件 execv(file, arglist) 除了使用参数向量列表,其他的和execl()相同 exec ...

  3. 浅谈分词算法(3)基于字的分词方法(HMM)

    目录 前言 目录 隐马尔可夫模型(Hidden Markov Model,HMM) HMM分词 两个假设 Viterbi算法 代码实现 实现效果 完整代码 参考文献 前言 在浅谈分词算法(1)分词中的 ...

  4. oracle先排序再分页

    只做简单记录 按操作时间排序1 SELECT A.*, ROWNUM RN FROM (SELECT * FROM v_log) A ORDER BY operatetime DESC 结果 可以发现 ...

  5. 如何使用Ajax从FastReport Web API获取报表

    在文章“如何在ASP.NET Web API中使用FastReport.Net”中,我们已经讨论了如何创建一个用于生成报表的Web服务.然后我们会收到报表的链接,现在我们来看看如何获​​取报表并使用a ...

  6. dp填表法,刷表法

    填表法:利用上一状态推当前 刷表法:利用当前推关联,利用刷表法较为便捷,向上边界较容易处理,处理在本次循环中的影响

  7. setTimeout设置不起作用

    setTimeout立刻调用了 a()方法而不是xx秒以后,是因为调用方法时候没有加双引号. 正确做法:setTimeout(" a() ",5000): 调用 a() 方法时候要 ...

  8. CF949D Curfew

    传送门 跟这个大佬学的->戳我 假设只有一个宿管,那么从前往后做的过程中,如果能到达某个寝室范围内的人数不够\(b\),那么不如把这个寝室空出来,这样更有利于后面的抉择;反之,就把这个寝室搞正好 ...

  9. Android学习笔记——Bluetooth的使用

    蓝牙应该是现在每一部智能手机的标配了.想当年在山寨机横行的年代里,蓝牙都可以做为一个卖点~~~ 废话不多说了,进入正题: 使用蓝牙功能是需要权限的,关于蓝牙的权限也就两个: <uses-perm ...

  10. Python 入门基础13 --模块与包

    本节内容: 一.模块及使用 1.模块及使用 2.起别名.from导入 3.自执行与模块 二.包的使用 2.1 包中模块的使用:import 2.2 包的嵌套 2.3 包中模块的使用:from ...i ...