实现原理

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. 如何学习TP框架

    1.学习访问方法 2.控制器的写法 3.视图的写法 4.模型的写法 5.扩展类的用法 6.扩展插件的用法

  2. GIT快速学习

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001373962845513ae ...

  3. 面试十大常见Java String问题

    本文介绍Java中关于String最常见的10个问题: 1. 字符串比较,使用 "==" 还是 equals() ?简单来说, "==" 判断两个引用的是不是同 ...

  4. c++包含头文件好还是重新定义好

    A.h struct A { int a; int b; }; B.cpp 在B.cpp里面用到这个结构体 有两种方法 .自己定义一个一模一样的结构体 struct A { }; .包含A.h头文件 ...

  5. :eq()中的参数详解——需要注意

    :eq()的括号中的参数如果是非负数则在DOM对象中按从上到下的顺序查找指定的元素,但是,如果是是负数,则在DOM中从下向上查找指定元素. 如下实例: 如果 $("#divTag div:e ...

  6. angularjs 发送ajax请求的问题

    在angularjs中使用 ajax 如果使用 jquery的 ajax发送请求会遇到结果返回了,但是页面的值却没有改变,如: $scope.queryNameMatch = function() { ...

  7. 用JS改变的元素CSS样式,css里display :none 隐藏 block 显示

    CSS样式的引用有3种方式:style引用.class引用.id引用,所以js改变元素的样式我们也分3种来说. 1.js改变由style方式引用的样式:方法一:document.divs.style. ...

  8. 查看虚拟机里的Centos7的IP(四)

    这里之所以是查看下IP ,是我们后面要建一个Centos远程工具Xshell 连接Centos的时候,需要IP地址,所以我们这里先 学会查看虚拟机里的Centos7的IP地址 首先我们登录操作系统 用 ...

  9. Vue.js之组件嵌套小demo

    Vue.js之组件嵌套的小demo项目 第一步:初始化一个wabpack项目,这里不在复述.第二步:在components文件夹下新建Header.vue Footer.vue和Users.vue三个 ...

  10. LOJ#2230. 「BJOI2014」大融合

    LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...