实现原理

Struts 2是通过Commons FileUpload文件上传。

Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件

具体实现:

一、创建index.jsp页面

 1 <body>
2 <s:form action="upload" method="post" theme="simple" enctype="multipart/form-data">
3 <table align="center" width="50%" border="1">
4 <tr>
5 <td>选择上传文件</td>
6 <td id="more">
7 <s:file name="file"></s:file>
8 <input type="button" value="Add More.." onclick="addMore()">
9 </td>
10 </tr>
11 <tr>
12 <td><s:submit type="button" value="submit" onclick="return checkf()"/></td>
13 <td><s:reset value="reset "></s:reset></td>
14 </tr>
15 </table>
16 <table align="center" width="50%" border="1">
17 <tr>
18 <td>测试.txt</td>
19 <td>
20 <a href="<s:url value='download.action'><s:param name='fileName'>测试.txt</s:param> </s:url>">下载</a>
21 </td>
22 </tr>
23 </table>
24 </s:form>
25 </body>

  创建result.jsp页面

 1 <body>
2 <s:form>
3 <div style="border:1px solid black">成功上传的文件:<br>
4 <ul style="list-style-type:decimal">
5 <s:iterator value="#request.fileName" id="file" status="status">
6 <li><s:property/> </li>
7 </s:iterator>
8 </ul>
9 </div>
10 </s:form>
11 </body>

当然别忘了在每个页面上都添加上struts2 标签引用<%@taglib prefix="s" uri="/struts-tags" %>

二、创建updown.js文件,在index.jsp中引用

 1 function checkf(){
2 var files = document.getElementsByName("file");
3 if(files[0].value.length!=0){
4 return true;
5 }else{
6 alert("请选择文件");
7 return false;
8 }
9 }
10 function addMore()
11 {
12 var td = document.getElementById("more");
13 var br = document.createElement("br");
14 var input = document.createElement("input");
15 var button = document.createElement("input");
16 input.type = "file";
17 input.name = "file";
18 button.type = "button";
19 button.value = "Remove";
20 button.onclick = function()
21 {
22 td.removeChild(br);
23 td.removeChild(input);
24 td.removeChild(button);
25 }
26 td.appendChild(br);
27 td.appendChild(input);
28 td.appendChild(button);
29 }

三、创建upDownloadAction.java

  1 package com.action;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.FileNotFoundException;
6 import java.io.FileOutputStream;
7 import java.io.InputStream;
8 import java.io.OutputStream;
9 import java.io.UnsupportedEncodingException;
10 import java.util.List;
11 import javax.servlet.http.HttpServletRequest;
14 import com.opensymphony.xwork2.ActionSupport;
15 import org.apache.struts2.ServletActionContext;
16
17 public class UpDownloadAction extends ActionSupport {
18
19 private static final long serialVersionUID = 1L;
20 private List<File> file;// 对应jsp中file标签
21 private List<String> fileFileName;//
22 private List<String> fileContentType;//
23 private String fileName;//获得jsp中pram参数
24 @SuppressWarnings("deprecation")
25 // 文件上传
26 public String uploadFiile() throws Exception {
27 String root = ServletActionContext.getServletContext().getRealPath(
28 "/upload");// 上传路径
29 System.out.println(root);
30 InputStream inputStream;
31 File destFile;
32 OutputStream os;
33 for (int i = 0; i < file.size(); i++) {
34 inputStream = new FileInputStream(file.get(i));
35 destFile = new File(root, this.getFileFileName().get(i));
36 os = new FileOutputStream(destFile);
37 byte[] buffer = new byte[400];
38 int length = 0;
39 while ((length = inputStream.read(buffer)) > 0) {
40 os.write(buffer, 0, length);
41 }
42 inputStream.close();
43 os.close();
44 }
45 HttpServletRequest request = ServletActionContext.getRequest();
46 request.setAttribute("fileName", fileFileName);
47 return SUCCESS;
48 }
49
50 // 文件下载
51 public InputStream getDownloadFile() throws FileNotFoundException,
52 UnsupportedEncodingException {
53 System.out.println(getFileName());
54
55 // 如果下载文件名为中文,进行字符编码转换
56 ServletActionContext.getResponse().setHeader("Content-Disposition","attachment;fileName="
57 + java.net.URLEncoder.encode(fileName, "UTF-8"));
58 InputStream inputStream = new FileInputStream("F:/" //使用绝对路径 ,从该路径下载“测试.txt"文件
59 + this.getFileName());
60 System.out.println(inputStream);
61 return inputStream;
62 }
63
64 // 下载
65 public String downloadFile() throws Exception {
66 return SUCCESS;
67 }
68
69 public String getFileName() throws UnsupportedEncodingException {
70 return fileName;
71 }
72
73 public void setFileName(String fileName)
74 throws UnsupportedEncodingException {
75 this.fileName = new String(fileName.getBytes("ISO8859-1"), "utf-8");
76 }
77 }

注:属性的 get和set方法已省略。

四、最后是配置文件

1、web.xml配置

1     <filter>
2 <filter-name>struts2</filter-name>
3 <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
4 </filter>
5
6 <filter-mapping>
7 <filter-name>struts2</filter-name>
8 <url-pattern>/*</url-pattern>
9 </filter-mapping>

2、struts.xml配置

 1 <struts>
2 <constant name="struts.i18n.encoding" value="utf-8"></constant>
3 <constant name="struts.multipart.saveDir" value="f:\"></constant>
4 <package name="struts2" extends="struts-default">
5 <action name="upload" class="com.action.UpDownloadAction" method="uploadFiile">
6 <result name="success">/jsp/result.jsp</result>
7 <interceptor-ref name="fileUpload">
8 <!--maximumSize (可选) - 这个拦截器允许的上传到action中的文件最大长度(以byte为单位).
9 注意这个参数和在webwork.properties中定义的属性没有关系,默认2MB-->
10 <param name="maximumSize">409600</param>
11 <!--allowedTypes (可选) - 以逗号分割的contentType类型列表(例如text/html),
12 这些列表是这个拦截器允许的可以传到action中的contentType.如果没有指定就是允许任何上传类型.-->
13 <param name="allowedTypes">
14 text/plain
15 </param>
16 </interceptor-ref>
17 <interceptor-ref name="defaultStack"></interceptor-ref>
18 </action>
19 <action name="download" class="com.action.UpDownloadAction" method="downloadFile" >
20 <result name="success" type="stream">
21 <!--指定文件下载类型 application/octet-stream默认值可以下载所有类型 -->
22 <param name="contentType">
23 application/txt;
24 </param>
25 <!-- 指定下载的文件名和显示方式 ,但注意中文名的乱码问题,解决办法是:进行编码处理-->
26 <!--contentDisposition是文件下载的处理方式,包括内联(inline)和附件(attachment),
27 默认是inline, 使用附件时这样配置:attachment;filename="文件名" 。-->
28 <param name="contentDisposition">
29 attachment;filename="${fileName}"
30 </param>
31 <!--由getDownloadFile()方法获得inputStream-->
32 <param name="inputName">downloadFile</param>
33 <!-- 指定下载文件的缓存大小-->
34 <param name="bufferSize">2048</param>
35 </result>
36 </action>
37 </package>
38 </struts>

一个简单的Struts2的多文件文件上传和单文件下载就实现了

struts2实现文件的上传和下载实例[转]的更多相关文章

  1. 使用Struts2实现文件的上传和下载

    (一)单个文件的上传步骤: 1.拷贝jar包:commons-fileupload.jar,  commons-io.jar 下载链接(文件上传.rar):http://www.cnblogs.com ...

  2. 基于struts2框架文件的上传与下载

    在开发一些社交网站时,需要有允许用户上传自己本地文件的功能,则需要文件的上传下载代码. 首先考虑的是文件的储存位置,这里不考虑存在数据库,因为通过数据库查询获取十分消耗资源与时间,故需将数据存储在服务 ...

  3. Struts2控制文件的上传与下载

    Struts2控制文件上传与下载的几个注意事项: (1)必须将表单的method设置为post,将enctype设置为multipart/from-data.只有这样,浏览器才会把用户选择文件的二进制 ...

  4. Struts2中文件的上传与下载

    文件上传 1.jsp页面 <s:form action="fileAction" namespace="/file" method="POST& ...

  5. JSP文件的上传和下载

    文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...

  6. Struts2实现文件的上传与动态下载功能。

    本篇主要使用Struts2实现文件的上传与动态下载功能.出于安全考虑,所以,在硬盘上存储上传的文件的时候,统一都重新命名为随机字符串.用数据库存储真实文件名与随机文件名称之间的关联. 下面的是实体类 ...

  7. java实现文件的上传和下载

    1. servlet 如何实现文件的上传和下载? 1.1上传文件 参考自:http://blog.csdn.net/hzc543806053/article/details/7524491 通过前台选 ...

  8. java实现ftp文件的上传与下载

    最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...

  9. 在SpringMVC框架下实现文件的 上传和 下载

    在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8" ...

随机推荐

  1. 【BZOJ2242】[SDOI2011]计算器 BSGS

    [BZOJ2242][SDOI2011]计算器 Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ ...

  2. 《从零开始学Swift》学习笔记(Day 14)——字符串的插入、删除和替换

    原创文章,欢迎转载.转载请注明:关东升的博客 对应可变字符串可以插入.删除和替换,String提供了几个方法可以帮助实现这些操作.这些方法如下: splice(_:atIndex:).在索引位置插入字 ...

  3. 1119 机器人走方格 V2(组合)

    1119 机器人走方格 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于 ...

  4. Java 科学计数法

    目录 Java 科学计数法 1 科学计数法的概念 1.1 有效数字 1.2 E记号 2 Java中的科学计数法 2.1 NumberFormat 2.2 DecimalFormat 2.3 BigDe ...

  5. AngularCli项目中添加字体图标(Font)详解

    本文主要讲如何在AngularCli生成的项目中使用字体图标. 一 SVG图标准备 将需要转换为字体图标的图片转换为SVG格式. 这个让项目视觉设计师搞定即可. 二 SVG图标转Font 可以通过Ic ...

  6. SpringMVC流程架构图

    [组件说明] 以下组件通常使用框架提供实现: 1.DisPatcherServlet:前端控制器(不需要程序员开发) 用户请求到达前端控制器,它相当于MVC模式中的C(Controller),Disp ...

  7. linux下安装mysql问题总结(一)mysqld_safe mysqld from pid file /usr/local/mysql/data/mysql.pid ended

    linux下安装mysql数据库 linux版本:CentOS release 6.8 (Final) mysql版本:mysql-5.7.16-linux-glibc2.5-x86_64.tar.g ...

  8. jQuery实现复选框全选、全不选、反选问题解析

    今天打算用jQuery实现一下复选框的全选.全不选和反选问题,刚开始用的是attr("checked",true/false)方法,发现只能在最开始实现一次全选,可以实现全不选,无 ...

  9. brew和brew cask安装

    brew 是从下载源码解压然后 ./configure && make install ,同时会包含相关依存库.并自动配置好各种环境变量,而且易于卸载. 这个对程序员来说简直是福音,简 ...

  10. jquery 字符串转为json

    使用ajax从服务器拿到的数据,jquery总是认为是字符串,无法直接使用,可以通过下面代码转换: $.get("服务器路径", function(data) { data = e ...