关于struts2的上传和下载

简介:

1. 1文件上传技术:

JSPSmartUpload:应用在Model1年代.(嵌入到JSP)

FileUpload:应用在Model2年代.

Servlet3.o:完成文件上传.

Struts2框架:完成文件上传.

1.2    文件上传要素:

* 1.表单的提交方式:POST.(POST 没有大小限制)

* 2.表单元素中需要有<input type=”file”>这个元素必须有一个name属性.

* 3.表单的enctype属性是multipart/form-data(MIME协议中的分部分.)

1.3   Struts2完成文件上传:

页面:

文件上传:<input type="file" name="upload"><br/>

 

1 <s:form theme="simple" action="templateAction_%{  id == null? 'add' : 'edit'  }" namespace="/" method="post" enctype="multipart/form-data">

 

Action:

提供三个属性:

private File upload; // 获得文件

private String uploadContentType; // 获得文件类型

private String uploadFileName; // 获得文件名

对三个属性提供set方法:

 

 

2.1  文件下载原理:

将服务器上一个文件输出到浏览器:

* 设置两个头和一个流.

* ContentType:文件的MIME类型.

* Content-Dispostion:提示下载.

* 代表文件的输入流:---(输出流是固定的response.getOutputStream();)

 

2.2    Struts2中的文件下载:

复制代码
  1 依赖一个stream的结果类型:
  2 在Action中提供:
  3 // 获得文件的MIME类型的方法:
  4     // 相当于Action类中有contentType属性.
  5     public String getContentType() {
  6         // 如何获得文件的MIME类型?
  7         String type = ServletActionContext.getServletContext().getMimeType(
  8                 filename);
  9         return type;
 10     }
 11 
 12     // 提供一个流
 13     public InputStream getInputStream() throws FileNotFoundException {
 14         // web 项目:
 15         // 获得download的磁盘绝对路径
 16         String realpath = ServletActionContext.getServletContext().getRealPath(
 17                 "/download");
 18         InputStream is = new FileInputStream(realpath + "/" + filename);
 19         return is;
 20     }
 21 
 22     // 文件的下载ContentDispostion中获得那个文件名:必须是编码后的文件名.
 23     // 中文:IE浏览器用URLEncoder Firefox:Base64编码.
 24     public String getFileName() throws IOException {
 25         // 获得浏览器类型:
 26         String agent = ServletActionContext.getRequest()
 27                 .getHeader("User-Agent");
 28         // 调用该方法进行编码
 29         String name = encodeDownloadFilename(filename, agent);
 30         return name;
 31     }
 32 
 33     /**
 34      * 下载文件时,针对不同浏览器,进行附件名的编码
 35      * 
 36      * @param filename
 37      *            下载文件名
 38      * @param agent
 39      *            客户端浏览器
 40      * @return 编码后的下载附件名
 41      * @throws IOException
 42      */
 43     public String encodeDownloadFilename(String filename, String agent)
 44             throws IOException {
 45         if (agent.contains("Firefox")) { // 火狐浏览器
 46             filename = "=?UTF-8?B?"
 47                     + new BASE64Encoder().encode(filename.getBytes("utf-8"))
 48                     + "?=";
 49         } else { // IE及其他浏览器
 50             filename = URLEncoder.encode(filename, "utf-8");
 51         }
 52         return filename;
 53     }
 54 
 55 在配置文件中:
 56     <!-- 配置文件下载的Action -->
 57     <package name="download" extends="struts-default">
 58         <action name="download" class="cn.itcast.struts2.demo2.DownloadAction">
 59             <!-- 完成下载 需要在result的type属性上使用stream -->
 60             <result name="success" type="stream">
 61                 <!-- 参数的name是stream结果类型中的参数的名称 -->
 62                 <!-- OGNL表达式:获得到Action中contentType的属性! -->
 63                 <param name="contentType">${contentType}</param>
 64                 <!-- 设置ContentDispostion -->
 65                 <param name="contentDisposition">attachment;filename=${fileName}</param>
 66                 <!-- <param name="inputName">${stream}</param> -->
 67             </result>
 68         </action>
 69     </package>
 70 依赖一个stream的结果类型:
 71 在Action中提供:
 72 // 获得文件的MIME类型的方法:
 73     // 相当于Action类中有contentType属性.
 74     public String getContentType() {
 75         // 如何获得文件的MIME类型?
 76         String type = ServletActionContext.getServletContext().getMimeType(
 77                 filename);
 78         return type;
 79     }
 80 
 81     // 提供一个流
 82     public InputStream getInputStream() throws FileNotFoundException {
 83         // web 项目:
 84         // 获得download的磁盘绝对路径
 85         String realpath = ServletActionContext.getServletContext().getRealPath(
 86                 "/download");
 87         InputStream is = new FileInputStream(realpath + "/" + filename);
 88         return is;
 89     }
 90 
 91     // 文件的下载ContentDispostion中获得那个文件名:必须是编码后的文件名.
 92     // 中文:IE浏览器用URLEncoder Firefox:Base64编码.
 93     public String getFileName() throws IOException {
 94         // 获得浏览器类型:
 95         String agent = ServletActionContext.getRequest()
 96                 .getHeader("User-Agent");
 97         // 调用该方法进行编码
 98         String name = encodeDownloadFilename(filename, agent);
 99         return name;
100     }
101 
102     /**
103      * 下载文件时,针对不同浏览器,进行附件名的编码
104      * 
105      * @param filename
106      *            下载文件名
107      * @param agent
108      *            客户端浏览器
109      * @return 编码后的下载附件名
110      * @throws IOException
111      */
112     public String encodeDownloadFilename(String filename, String agent)
113             throws IOException {
114         if (agent.contains("Firefox")) { // 火狐浏览器
115             filename = "=?UTF-8?B?"
116                     + new BASE64Encoder().encode(filename.getBytes("utf-8"))
117                     + "?=";
118         } else { // IE及其他浏览器
119             filename = URLEncoder.encode(filename, "utf-8");
120         }
121         return filename;
122     }
123 
124 在配置文件中:
125     <!-- 配置文件下载的Action -->
126     <package name="download" extends="struts-default">
127         <action name="download" class="cn.itcast.struts2.demo2.DownloadAction">
128             <!-- 完成下载 需要在result的type属性上使用stream -->
129             <result name="success" type="stream">
130                 <!-- 参数的name是stream结果类型中的参数的名称 -->
131                 <!-- OGNL表达式:获得到Action中contentType的属性! -->
132                 <param name="contentType">${contentType}</param>
133                 <!-- 设置ContentDispostion -->
134                 <param name="contentDisposition">attachment;filename=${fileName}</param>
135                 <!-- <param name="inputName">${stream}</param> -->
136             </result>
137         </action>
138     </package>
复制代码

 

 




本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/4005981.html,如需转载请自行联系原作者
相关文章
|
8月前
|
Java
Struts文件上传与下载详解_上传单个文件
Struts文件上传与下载详解_上传单个文件
|
8月前
|
Java
Struts文件上传与下载详解 _上传多个文件
Struts文件上传与下载详解 _上传多个文件
|
8月前
|
存储 前端开发 Java
SpringMVC 文件上传和下载
SpringMVC 文件上传和下载
47 0
|
8月前
|
Java
Struts文件上传与下载详解_文件的下载
Struts文件上传与下载详解_文件的下载
|
Java
基于SpringMVC的上传和下载
基于SpringMVC的上传和下载
83 0
基于SpringMVC的上传和下载
|
JSON 前端开发 Java
springmvc文件的上传和下载
springmvc文件的上传和下载
154 0
springmvc文件的上传和下载
|
前端开发 Java Maven
【SpringMVC 从 0 开始】文件上传和下载
【SpringMVC 从 0 开始】文件上传和下载
【SpringMVC 从 0 开始】文件上传和下载
|
前端开发 Java Maven
SpringMVC文件上传与下载
SpringMVC文件上传与下载
|
前端开发 应用服务中间件
Struts2实现单文件上传,多文件上传与下载(十)中
Struts2实现单文件上传,多文件上传与下载(十)
118 0
Struts2实现单文件上传,多文件上传与下载(十)中