Struts2文件上传与下载

  rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">

1.    文件上传的原理:

表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:

1)      application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。

2)      multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。

3)      text/plain:这种方式主要适用于直接通过表单发送邮件的方式。

文件上传下載web application常常用到的。原理是,通过为表单元素设置enctype=”multipart/form-data”属性,让表单提交的数据以二进制编码的方式提交,在接收此request的后臺程序中用二進制流來獲取內容.就可以取得上传文件的内容,从而实现文件的上传。

文件上传项目:一个是Common-FileUpload组件,另一个是Oreilly组织的COS框架。,利用这个框架都能很方便的实现文件的上传。

2.

Struts2默认使用的是JakartaCommon-FileUpload框架来上传文件,需要两个Jar文件:commons-fileupload-1.2.jarcommons-io-1.4.jar

如果要改成其它的文件上传框架,可以修改struts.multipart.parser常量的值为cos/pell,默认值是jakata

代码:
upload.jsp,可上传一个或多个附件
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2.     pageEncoding="UTF-8"%> 
  3. <%@ taglib prefix="s" uri="/struts-tags" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. <script type="text/javascript">
  10. function addMore()
  11. {
  12.     var td = document.getElementById("more");
  13.     
  14.     var br = document.createElement("br");
  15.     var input = document.createElement("input");
  16.     var button = document.createElement("input");
  17.     
  18.     input.type = "file";
  19.     input.name = "file";
  20.     
  21.     button.type = "button";
  22.     button.value = "Remove";
  23.     
  24.     button.onclick = function()
  25.     {
  26.         td.removeChild(br);
  27.         td.removeChild(input);
  28.         td.removeChild(button);
  29.     }
  30.     
  31.     td.appendChild(br);
  32.     td.appendChild(input);
  33.     td.appendChild(button);
  34. }
  35. </script>
  36. </head>
  37. <body>
  38.     <table align="center" width="50%">
  39.             <tr>
  40.                 <td>
  41.                     <s:fielderror cssStyle="color:red" />
  42.                 </td>
  43.             </tr>
  44.         </table>
  45.         <s:form action="upload" theme="simple" enctype="multipart/form-data">
  46.             <table align="center" width="50%" border="1">
  47.                 <tr>
  48.                     <td>
  49.                         username
  50.                     </td>
  51.                     <td>
  52.                         <s:textfield name="username"></s:textfield>
  53.                     </td>
  54.                 </tr>
  55.                 <tr>
  56.                     <td>
  57.                         password
  58.                     </td>
  59.                     <td>
  60.                         <s:password name="password"></s:password>
  61.                     </td>
  62.                 </tr>
  63.                 <tr>
  64.                     <td>
  65.                         file
  66.                     </td>
  67.                     <td id="more">
  68.                         <s:file name="file"></s:file><input type="button" value="Add More.." οnclick="addMore()">
  69.                     </td>
  70.                 </tr>
  71.                 <tr>
  72.                     <td>
  73.                         <s:submit value=" submit "></s:submit>
  74.                     </td>
  75.                     <td>
  76.                         <s:reset value=" reset "></s:reset>
  77.                     </td>
  78.                 </tr>
  79.             </table>
  80.         </s:form>
  81. </body>
  82. </html>
uploadAction:
  1. package com.test.action;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.util.List;
  8. import org.apache.struts2.ServletActionContext;
  9. import com.opensymphony.xwork2.ActionSupport;
  10. public class UploadAction extends ActionSupport
  11. {
  12.     private List<File> file;
  13.     private List<String> fileFileName;
  14.     private List<String> fileContentType;
  15.     //可通过依赖注入保存路径,
  16.     //private String savePath;
  17.     //setter,getter方法省略
  18.     @Override
  19.     public String execute() throws Exception
  20.     {
  21.         for (int i = 0; i < file.size(); ++i)
  22.         {
  23.             InputStream is = new FileInputStream(file.get(i));
  24.             String root = ServletActionContext.getRequest().getRealPath(
  25.                     "/upload");
  26.             File destFile = new File(root, this.getFileFileName().get(i));
  27.             OutputStream os = new FileOutputStream(destFile);
  28.             byte[] buffer = new byte[400];
  29.             int length = 0;
  30.             while ((length = is.read(buffer)) > 0)
  31.             {
  32.                 os.write(buffer, 0, length);
  33.             }
  34.             is.close();
  35.             os.close();
  36.         }
  37.         return SUCCESS;
  38.     }
  39. }

上面这个 Action 类中,file 属性来对应页面的表单域属性,用来封装表单域的请求参数。
但是,值得注意的是,此 Action 中还有两个属性: fileFileName fileContentType ,这两个属性分别用于封装上传文件的文件名、文件类型。这是 Struts2 设计的独到之处: Strut2 Action 类直接通过 File 类型属性直接封装了上传文件的文件内容,但这个 File 属性无法获取上传文件的文件名和文件类型,所以 Struts2 就直接将文件域中包含的上传文件名和文件类型的信息封装到 fileFileName fileContentType 属性中,也就是说 Struts2 针对表单中名为 xxx 的文件域,在对应的 Action 类中使用 3 个属性来封装该文件域信息
类型为 File xxx 属性:用来封装页面文件域对应的文件内容。
类型为 String xxxFileName 属性:用来封装该文件域对应的文件的文件名。
类型为 String xxxContentType 属性:用来封装该文件域应用的文件的文件类型。
另外,在这个 Action 类可使用 savePath 属性,它的值可通过配置文件来动态设置的,这也是 Strut2 设计中的一个依赖注入特性的使用。
配置文件struts.xml
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6.     <constant name="struts.i18n.encoding" value="UTF-8"></constant>
  7.     <!-- 临时文件的储存目录 -->
  8.     <constant name="struts.multipart.saveDir" value="c:/"></constant>
  9.     <package name="struts2" extends="struts-default">
  10.         <action name="upload" class="com.test.action.UploadAction">
  11.             <result name="success">/uploadResult.jsp</result>
  12.             <result name="input">/upload.jsp</result>
  13.             <interceptor-ref name="fileUpload">
  14.                 <param name="maximumSize">409600</param>
  15.                
  16.                 <!-- 上傳文件允許的類型 -->
  17.                 <param name="allowedTypes">
  18.                     application/vnd.ms-powerpoint,image/gif,image/jpeg,text/html,application/pdf,
  19.                     application/vnd.ms-powerpoint,application/x-visio,application/vnd.ms-excel,
  20.                     application/zip,application/msword
  21.                 </param>
  22.             </interceptor-ref>
  23.             <interceptor-ref name="defaultStack"></interceptor-ref>
  24.              <!--<param name="savePath">/upload</param>-->
  25.         </action>
  26. </package>
  27. </struts>
在资源文件中可添加错误提示信息,不过别忘记编码转换
# 更改上传文件类型不允许的提示信息
struts.messages.error.content.type.not.allowed= 文件上传失败:你要上传的文件类型不允许
# 更改上传文件太大的提示信息
struts.messages.error.file.too.large= 文件上传失败:你要上传的文件太大
# 文件上传其它错误信息
struts.messages.error.uploading= 文件上传失败:发生内部错误

Struts2文件下载


在配置文件中增加action
  1. <action name="download" class="com.test.action.FileDownloadAction">
  2.             <result name="success" type="stream">
  3.             <!--    <param name="contentType">
  4.                     application/vnd.ms-powerpoint,image/gif,image/jpeg,text/html,application/pdf,
  5.                     application/x-visio,application/vnd.ms-excel,
  6.                     application/zip,application/msword
  7.                 </param>
  8.              <param name="contentType">${contentType}</param>  -->
  9.                 <param name="inputName">inputStream</param>
  10.                 <param name="bufferSize">4096</param>
  11.                 <param name="contentDisposition">filename="${filename}"</param>
  12.                 <param name=""></param>
  13.             </result>
  14.         </action>
Action:
  1. import com.opensymphony.xwork2.ActionSupport;
  2. public class FileDownloadAction  extends ActionSupport{
  3.     private String inputPath;
  4.     private String contentType;
  5.     private String filename;
  6.     public InputStream getInputStream() throws Exception{
  7.         return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
  8.     }
  9.     @Override
  10.     public String execute() throws Exception {
  11.         inputPath="/upload/Struts2.ppt";//要下載的文件名稱
  12.         filename="Struts2.ppt"//保存文件時的名稱
  13.         //contentType="application/vnd.ms-powerpoint";
  14.         return SUCCESS;
  15.     }
  16.     //setter,getter方法省略
  17. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值