[原创]java WEB学习笔记72:Struts2 学习之路-- 文件的上传下载,及上传下载相关问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[原创]java WEB学习笔记72:Struts2 学习之路-- 文件的上传下载,及上传下载相关问题相关的知识,希望对你有一定的参考价值。

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.文件上传

  1)表单需要注意三点:

     ① 须把 html 表单的 enctype 属性设置为 multipart/form-data

       ②须把 HTML 表单的method 属性设置为 post

     ③需添加 <input type=“file”> 字段. 

  2)Struts2 的文件上传实际使用的是Common FileUpload 组件,导入jar包。commons-fileupload / commons-io 

  3)Struts2 进行文件上传需要使用FileUpload拦截器

  4)基本的文件操作:直接在Action 中定义如下 3个属性,并提供对应的get / set方法

       private File  [fileFieldName];    //文件对应的file 对象

     private String  [fileFieldName]ContentType; // 文件类型

     private String  [fileFieldName]pptFileName; // 文件名

  5)使用IO 流进行文件的上传

 

技术分享
 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 4     "http://struts.apache.org/dtds/struts-2.3.dtd">
 5 
 6 <struts>
 7  
 8  
 9      <!-- 配置国际化资源文件 -->
10      <constant name="strut2.custom.i18n.resouce" value="i18n"></constant>
11      
12      <constant name="struts.action.extension" value="action,do,"></constant>
13      <package name="default" namespace="/" extends="struts-default">
14      
15          <action name="testUpload" class="com.jason.upload.app.UploadAction">
16              <result>/sucess.jsp</result>
17          </action>
18          
19      </package>
20     
21 </struts>
struts.xml

 

技术分享
 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 </head>
10 <body>
11 
12     <s:form action="testUpload" method="post" enctype="multipart/form-data">
13         <s:file name="ppt" label="PPTfile"></s:file>
14         <s:textfield  name="pptDesc" label="PPTDesc"></s:textfield>
15         
16         <s:submit></s:submit>
17     </s:form>
18     
19 
20 </body>
21 </html>
upload.jsp
技术分享
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10 
11     <h4> success page</h4>
12 </body>
13 </html>
sucess.jsp

 

技术分享
 1 package com.jason.upload.app;
 2 
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.FileOutputStream;
 6 
 7 import javax.servlet.Servlet;
 8 import javax.servlet.ServletContext;
 9 
10 import org.apache.struts2.ServletActionContext;
11 
12 import com.opensymphony.xwork2.ActionSupport;
13 
14 public class UploadAction extends ActionSupport {
15 
16     /**
17      * @Fields:serialVersionUID
18      */
19     private static final long serialVersionUID = 1L;
20 
21     private File ppt;
22     private String pptContentType;
23     private String pptFileName;
24     
25     
26     public File getPpt() {
27         return ppt;
28     }
29 
30     public void setPpt(File ppt) {
31         this.ppt = ppt;
32     }
33 
34     public String getPptContentType() {
35         return pptContentType;
36     }
37 
38     public void setPptContentType(String pptContentType) {
39         this.pptContentType = pptContentType;
40     }
41 
42     public String getPptFileName() {
43         return pptFileName;
44     }
45 
46     public void setPptFileName(String pptFileName) {
47         this.pptFileName = pptFileName;
48     }
49     
50     
51     @Override
52     public String execute() throws Exception {
53     
54         ServletContext  servletContext = ServletActionContext.getServletContext();
55         
56         String dir = servletContext.getRealPath("/files/" + pptFileName);
57         System.out.println(dir);
58         
59         FileOutputStream out = new FileOutputStream(dir);
60         FileInputStream in = new FileInputStream(ppt);
61         
62         byte[] buffer = new byte[1024];
63         int len = 0;
64         while((len = in.read(buffer)) != -1){
65             out.write(buffer, 0, len);
66         }
67           out.close();
68           in.close();
69         
70         
71         System.out.println(ppt);
72         System.out.println(pptContentType);
73         System.out.println(pptFileName);
74         return SUCCESS;
75     }
76 
77 }
UploadAction.java

 

 

 

2.相关问题

  1)一次性上传过个文件?

   若传递多个文件,则上述3个属性,可以改为list类型,多个文件的name 属性需要一致

    

 1 <s:form action="testUpload" method="post" enctype="multipart/form-data">
 2         <s:file name="ppt" label="PPTfile"></s:file>
 3         <s:textfield  name="pptDesc[0]" label="PPTDesc"></s:textfield>
 4         
 5         <s:file name="ppt" label="PPTfile"></s:file>
 6         <s:textfield  name="pptDesc[1]" label="PPTDesc"></s:textfield>
 7         
 8         <s:file name="ppt" label="PPTfile"></s:file>
 9         <s:textfield  name="pptDesc[2]" label="PPTDesc"></s:textfield>
10         
11         <s:file name="ppt" label="PPTfile"></s:file>
12         <s:textfield  name="pptDesc[3]" label="PPTDesc"></s:textfield>
13         
14         <s:submit></s:submit>
15     </s:form>

 

  

  

1     private List<File> ppts;
2     private String pptContentType;
3     private String pptFileName;

 

 

  2)对上传文件的限制?例如扩展名,内容类型,上传文件的大小?如果出错, 显示错误消息?消息可以定制?

Interceptor parameters: 

•maximumSize (optional) - the maximum size (in bytes) that the interceptor will allow a file reference to be set on the action. Note, this is not related to the various properties found in struts.properties. Default to approximately 2MB.

默认文件的最大值2M,上传的单个文件

•allowedTypes (optional) - a comma separated list of content types (ie: text/html) that the interceptor will allow a file reference to be set on the action. If none is specified allow all types to be uploaded.
允许上传的文件类型,多个使用 ‘,‘ 分割

•allowedExtensions (optional) - a comma separated list of file extensions (ie: .html) that the interceptor will allow a file reference to be set on the action. If none is specified allow all extensions to be uploaded.
允许的上传文件的类型,多个使用 ‘ , ’分割

 

 

定制文件上传错误消息

This interceptor will add several field errors, assuming that the action implements ValidationAware. These error messages are based on several i18n values stored in struts-messages.properties, a default i18n file processed for all i18n requests. You can override the text of these messages by providing text for the following keys: 

•struts.messages.error.uploading - a general error that occurs when the file could not be uploaded
文件上传出错的消息 •struts.messages.error.file.too.large
- occurs when the uploaded file is too large 文件超过最大值的消息 •struts.messages.error.content.type.not.allowed - occurs when the uploaded file does not match the expected content types specified 文件内容不合法的消息 •struts.messages.error.file.extension.not.allowed - occurs when the uploaded file does not match the expected file extensions specified
文件扩展名不合法的消息

 

 

可以参考 org.apache.struts2. 下的 struts-message.properties ,可提供更多的定制信息

在 org.apache.struts2. 下的 default.properties 中有对文件上传总的大小的限制。可以使用常量的方式,修改限制:struts.multipart.maxSize = ?

技术分享
 1  1 <!-- 配置国际化资源文件 -->
 2  2      <constant name="strut2.custom.i18n.resouce" value="i18n"></constant>
 3  3      
 4  4      <constant name="struts.action.extension" value="action,do,"></constant>
 5  5      
 6  6      <package name="default" namespace="/" extends="struts-default">
 7  7      
 8  8          <interceptors>
 9  9              <interceptor-stack name="jasonStack">
10 10                  <interceptor-ref name="defaultStack">
11 11                      <param name="fileUpload.maximumSize">2000</param>
12 12                      <param name="fileUpload.allowedTypes">text/html,text/xml</param>
13 13                      <param name="fileUpload.allowedExtensions">html,ppt,xml</param>
14 14                  </interceptor-ref>
15 15              </interceptor-stack>
16 16          </interceptors>
17 17          
18 18          
19 19          <default-interceptor-ref name="jasonStack"></default-interceptor-ref>
20 20          <action name="testUpload" class="com.jason.upload.app.UploadAction">
21 21              <result>/sucess.jsp</result>
22 22          </action>
23 23          
24 24      </package>
25 25  
struts.xml

 

技术分享
1 struts.messages.error.uploading=\u6587\u4EF6\u4E0A\u4F20\u51FA\u9519\u7684\u6D88\u606F
2 struts.messages.error.file.too.large=\u6587\u4EF6\u8D85\u8FC7\u6700\u5927\u503C\u7684\u6D88\u606F
3 struts.messages.error.content.type.not.allowed=\u6587\u4EF6\u5185\u5BB9\u4E0D\u5408\u6CD5\u7684\u6D88\u606F
4 struts.messages.error.file.extension.not.allowed=\u6587\u4EF6\u6269\u5C55\u540D\u4E0D\u5408\u6CD5\u7684\u6D88\u606F
i18n.properties

 

 

 

 

2.文件的下载

  1)struts2 中使用 type="stream" 的result 进行下载即可:具体细节 /struts-2.3.15.3-all/struts-2.3.15.3/docs/WW/docs/stream-result.html

  2)Struts 专门为文件下载提供了一种 Stream 结果类型. 在使用一个 Stream 结果时, 不必准备一个 JSP 页面.

  3)Stream 结果类型可以设置如下参数:(以下参数可以在Action中以 getter 方法的方式提供)

      - contentType:被下载的文件的 MIME 类型。默认值为 text/plain

      - contentLength:被下载的文件的大小,以字节为单位

      - contentDisposition: 可以设置下载文件名的ContentDispositon 响应头,默认值为 inline,通常设置为如下格式: attachment;filename="document.pdf".

      - inputName:Action 中提供的文件的输入流。默认值为 inputStream

 

      - bufferSize:文件下载时缓冲区的大小。默认值为 1024

      - allowCaching :文件下载时是否允许使用缓存。默认值为 true

      - contentCharSet:文件下载时的字符编码。

4)Stream 结果类型的参数可以在 Action 以属性的方式覆盖

 

download.jsp

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     <a href="testDownload">Down Load</a>
11 </body>
12 </html>

 

 

 

DownLoadAction.java
对于
contentType
contentLength
contentDisposition
inputStream
我们需要在对应的Action 中声明一个变量 且提供 getter方法
 1 package com.jason.upload.app;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.InputStream;
 5 
 6 import javax.servlet.ServletContext;
 7 
 8 import org.apache.struts2.ServletActionContext;
 9 
10 import com.opensymphony.xwork2.ActionSupport;
11 
12 public class DownLoadAction extends ActionSupport {
13 
14     /**
15      * @Fields:serialVersionUID
16      */
17     private static final long serialVersionUID = 1L;
18 
19     private String contentType;
20     private long contentLength;
21     private String contentDisposition;
22     private InputStream inputStream;
23 
24     public String getContentDisposition() {
25         return contentDisposition;
26     }
27 
28     public long getContentLength() {
29         return contentLength;
30     }
31 
32     public String getContentType() {
33         return contentType;
34     }
35 
36     public InputStream getInputStream() {
37         return inputStream;
38     }
39     @Override
40     public String execute() throws Exception {
41         
42         //1.确定各成员的值
43         contentType = "text/html";
44         contentDisposition = "attachment;filename=‘a.html‘";
45         
46         ServletContext  servletContext = ServletActionContext.getServletContext();
47         String fileName = servletContext.getRealPath("/files/a.html");
48         inputStream = new FileInputStream(fileName);
49         contentLength = inputStream.available();
50         return super.execute();
51     }
52 
53 }

 

 

struts.xml

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 4     "http://struts.apache.org/dtds/struts-2.3.dtd">
 5 
 6 <struts>
 7 <action name="testDownload" class="com.jason.upload.app.DownLoadAction">
 8              <result type="stream">
 9                  <param name="bufferSize">2048</param>
10              </result>
11          </action>
12 </package>
13          
14 </struts>

 

 

 

 

 

 

 

 

 

 

 

以上是关于[原创]java WEB学习笔记72:Struts2 学习之路-- 文件的上传下载,及上传下载相关问题的主要内容,如果未能解决你的问题,请参考以下文章

[原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程

[原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

[原创]java WEB学习笔记74:Struts2 学习之路--自定义拦截器,struts内建的拦截器

[原创]java WEB学习笔记6:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,Prepar

[原创]java WEB学习笔记70:Struts2 学习之路-- 输入验证,声明式验证,声明是验证原理

[原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交