首页 > 代码库 > 关于struts2的上传和下载

关于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 filename106      *            下载文件名107      * @param agent108      *            客户端浏览器109      * @return 编码后的下载附件名110      * @throws IOException111      */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>

 

 

 

 

关于struts2的上传和下载