Struts2总结---文件上传(单文件/多文件)、下载 (13)

来源:互联网 发布:iphone看小说软件 编辑:程序博客网 时间:2024/06/13 08:57

<一>简述:

Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置,<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>


<二>指定用户上传文件的大小,有两种方式

1)默认是在default.properties 文件的 struts.multipart.maxSize=2097152  键值指定为2097152 也就是2M,通过计算 2097152/(1024*1024) = 2 M

那我们可以改变其默认值,只要在src目录下,新建一个 struts.properties 文件,指定上传大小 如下:


一次上传只可以上传10M,不管一次上传多少个文件,按总和计算


2)在struts.xml文件中指定,如图:


其实name就对应struts.properties的键,value对应 值


注意:如果即在struts.properties设定文件上传大小,又在struts.xml 设定文件上传大小,则struts.properties的优先级高于struts.xml,一般在一处指定上传大小即可,推荐 struts.properties



<三>Struts2之单文件上传


1.fileupload.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>      <%      String path = request.getContextPath();      String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";      %>            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">      <html>        <head>          <base href="<%=basePath%>">                    <title>My JSP 'fileupload.jsp' starting page</title>                    <meta http-equiv="pragma" content="no-cache">          <meta http-equiv="cache-control" content="no-cache">          <meta http-equiv="expires" content="0">              <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">          <meta http-equiv="description" content="This is my page">          <!--         <link rel="stylesheet" type="text/css" href="styles.css">         -->              </head>                <body>           <!-- enctype 默认是 application/x-www-form-urlencoded -->           <form action="FileUpload2" enctype="multipart/form-data" method="post" >                                   用户名:<input type="text" name="usename"> <br/>                     上传文件:<input type="file" name="file1"><br/>                                         <input type="submit" value="提交"/>                      </form>                                         </body>      </html>  

2.具体处理上传的 FileUpload.java

package com.struts2.fileupload;    import java.io.File;  import java.io.FileInputStream;  import java.io.FileOutputStream;  import java.io.InputStream;  import java.io.OutputStream;    import org.apache.struts2.ServletActionContext;    import com.opensymphony.xwork2.ActionSupport;    /**  * 单个文件上传  * @author Administrator  * 上传文件其实是上传了两份,  *   * 首先将上传的文件保存到 default.properties 文件中 struts.multipart.saveDir键指定的目录中  * 默认是空的  * 保存在  Tomcat 6.0\work\Catalina\localhost\struts2目录下以.tmp后缀名的文件  *   * 如果要在 struts.multipart.saveDir 指定目录, 则可以在 src文件夹下 建一个 struts.properties,  * 覆盖  default.properties 的某些键值  *   * 还有一份是 存放在自己设定的目录下  */  public class FileUpload extends ActionSupport {            private String usename ;      private File file1 ; //具体上传文件的 引用 , 指向临时目录中的临时文件      private String file1FileName ;  // 上传文件的名字 ,FileName 固定的写法      private String file1ContentType ; //上传文件的类型, ContentType 固定的写法            public String getUsename() {          return usename;      }      public void setUsename(String usename) {          this.usename = usename;      }      public File getFile1() {          return file1;      }      public void setFile1(File file1) {          this.file1 = file1;      }      public String getFile1FileName() {          return file1FileName;      }      public void setFile1FileName(String file1FileName) {          this.file1FileName = file1FileName;      }      public String getFile1ContentType() {          return file1ContentType;      }      public void setFile1ContentType(String file1ContentType) {          this.file1ContentType = file1ContentType;      }            @Override      public String execute() throws Exception {          //获取文件存储路径          String path = ServletActionContext.getRequest().getRealPath("/upload");          //输出流          OutputStream os = new FileOutputStream(new File(path,file1FileName));          //输入流          InputStream is = new FileInputStream(file1);                    byte[] buf = new byte[1024];          int length = 0 ;                    while(-1 != (length = is.read(buf) ) )          {              os.write(buf, 0, length) ;          }          is.close();          os.close();                    return SUCCESS;      }                      } 

3.最终显示结果的页面,filedemo.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>      <%@ taglib prefix="s" uri="/struts-tags" %>            <%      String path = request.getContextPath();      String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";      %>            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">      <html>        <head>          <base href="<%=basePath%>">                    <title>My JSP 'filedemo.jsp' starting page</title>                    <meta http-equiv="pragma" content="no-cache">          <meta http-equiv="cache-control" content="no-cache">          <meta http-equiv="expires" content="0">              <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">          <meta http-equiv="description" content="This is my page">          <!--          <link rel="stylesheet" type="text/css" href="styles.css">          -->              </head>                <body>          上传成功: <br/>          usename: <s:property value="usename" /><br/>          file: <s:property value="file1FileName"/><br/>          contentType: <s:property value="file1ContentType"/>                  </body>      </html>  

<四>Struts2之多文件上传

1.fileupload.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>      <%      String path = request.getContextPath();      String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";      %>            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">      <html>        <head>          <base href="<%=basePath%>">                    <title>My JSP 'fileupload.jsp' starting page</title>                    <meta http-equiv="pragma" content="no-cache">          <meta http-equiv="cache-control" content="no-cache">          <meta http-equiv="expires" content="0">              <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">          <meta http-equiv="description" content="This is my page">          <!--         <link rel="stylesheet" type="text/css" href="styles.css">         -->              </head>                <body>           <!-- enctype 默认是 application/x-www-form-urlencoded -->           <form action="FileUpload2" enctype="multipart/form-data" method="post" >                                   用户名:<input type="text" name="usename"> <br/>                     上传文件:<input type="file" name="file1"><br/>                     上传文件: <input type="file" name="file1"><br/> <!-- 两个名字相同 都是file1 -->                    <input type="submit" value="提交"/>                      </form>                                         </body>      </html>  

两个上传文件的name属性值要是一样的,后台方便处理


2.具体处理上传文件的FileUpload2.Java

多文件上传用集合的方式

    package com.struts2.fileupload;            import java.io.File;      import java.io.FileInputStream;      import java.io.FileOutputStream;      import java.io.InputStream;      import java.io.OutputStream;      import java.util.List;            import org.apache.struts2.ServletActionContext;            import com.opensymphony.xwork2.ActionSupport;            /**      * 多文件上传,用集合的方式      * @author Administrator      *      */            public class FileUpload2 extends ActionSupport {                    private String usename ;          private List<File> file1 ;          private List<String> file1FileName ;          private List<String> file1ContentType ;                    public String getUsename() {              return usename;          }          public void setUsename(String usename) {              this.usename = usename;          }          public List<File> getFile1() {              return file1;          }          public void setFile1(List<File> file1) {              this.file1 = file1;          }          public List<String> getFile1FileName() {              return file1FileName;          }          public void setFile1FileName(List<String> file1FileName) {              this.file1FileName = file1FileName;          }          public List<String> getFile1ContentType() {              return file1ContentType;          }          public void setFile1ContentType(List<String> file1ContentType) {              this.file1ContentType = file1ContentType;          }                    @Override          public String execute() throws Exception {                            //获取文件存储路径              String path = ServletActionContext.getRequest().getRealPath("/upload");                            for(int i = 0 ; i < file1.size() ; i++ )              {                  OutputStream os = new FileOutputStream(new File(path,file1FileName.get(i)));                                    InputStream is = new FileInputStream(file1.get(i));                                    byte[] buf = new byte[1024];                  int length = 0 ;                                    while(-1 != (length = is.read(buf) ) )                  {                      os.write(buf, 0, length) ;                  }                                    is.close();                  os.close();                                }                            return SUCCESS;          }            }  

3.用于显示的界面filedemo.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>      <%@ taglib prefix="s" uri="/struts-tags" %>            <%      String path = request.getContextPath();      String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";      %>            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">      <html>        <head>          <base href="<%=basePath%>">                    <title>My JSP 'filedemo2.jsp' starting page</title>                    <meta http-equiv="pragma" content="no-cache">          <meta http-equiv="cache-control" content="no-cache">          <meta http-equiv="expires" content="0">              <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">          <meta http-equiv="description" content="This is my page">          <!--         <link rel="stylesheet" type="text/css" href="styles.css">         -->              </head>                <body>                    上传成功:<br/>           usename:<s:property value="usename"/><br/>                    <!-- 遍历值 -->                    <s:iterator value="file1FileName" id="f"> <!-- id是一个对象,目前是一个字符串集合  可任意命名 -->                                                       文件:<s:property value="#f"/> <br/>                       <!-- 这里也可以调用方法  <s:property value="#f.toUpperCase()"/> -->                    </s:iterator>                            </body>      </html>  


<三>文件下载

文件下载是一个很常见的功能,用struts2实现文件下载的步骤:


一)定义一个Action类,FileDownload.Java

    package com.struts2.filedownload;            import java.io.InputStream;                  import org.apache.struts2.ServletActionContext;                  import com.opensymphony.xwork2.ActionSupport;            //文件下载      public class FileDownload extends ActionSupport{                    private int number ;                private String fileName;                public int getNumber() {              return number;          }                public void setNumber(int number) {              this.number = number;          }                    public String getFileName() {              return fileName;          }                public void setFileName(String fileName) {              this.fileName = fileName;          }                //返回一个输入流,作为一个客户端来说是一个输入流,但对于服务器端是一个 输出流          public InputStream getDownloadFile() throws Exception          {              if(1 == number)              {                 this.fileName = "Dream.jpg" ;                 //获取资源路径                 return ServletActionContext.getServletContext().getResourceAsStream("upload/Dream.jpg") ;              }                            else if(2 == number)              {                  this.fileName = "jd2chm源码生成chm格式文档.rar" ;                  //解解乱码                  this.fileName = new String(this.fileName.getBytes("GBK"),"ISO-8859-1");                  return ServletActionContext.getServletContext().getResourceAsStream("upload/jd2chm源码生成chm格式文档.rar") ;              }              else                 return null ;          }                    @Override          public String execute() throws Exception {                            return SUCCESS;          }            }  

二)在struts.xml文件中配置相关信息

    <struts>               <package name="struts2" extends="struts-default">                   <action name="FileDownload" class="com.struts2.filedownload.FileDownload">                 <result name="success" type="stream">                     <param name="contentType">text/plain</param>                     <param name="contentDisposition">attachment;fileName="${fileName}"</param>                     <param name="inputName">downloadFile</param>                     <param name="bufferSize">1024</param>                 </result>             </action>                  </package>               </struts>  

1.结果类型必须要写成 type="stream"  ,与之对应的处理类是 org.apache.struts2.dispatcher.StreamResult


2.涉及到的参数:


3.

1)  <param name="contentDisposition">attachment;fileName="${fileName}"</param>

     contentDisposition默认是 inline(内联的), 比如说下载的文件是文本类型的,就直接在网页上打开,不能直接打开的才会打开下载框自己选择

2)  attachment :下载时会打开下载框

3)  fileName="${fileName}" :在这定义的名字是一个动态的,该名字是显示在下载框上的文件名字


4.<param name="inputName">downloadFile</param>,这个downloadFile名字要和FileDownload.java类中的getDownloadFile()方法名去掉get 一致


三)用于显示下载的链接界面 filedownload.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>      <%      String path = request.getContextPath();      String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";      %>            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">      <html>        <head>          <base href="<%=basePath%>">                    <title>My JSP 'filedownload.jsp' starting page</title>                    <meta http-equiv="pragma" content="no-cache">          <meta http-equiv="cache-control" content="no-cache">          <meta http-equiv="expires" content="0">              <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">          <meta http-equiv="description" content="This is my page">          <!--         <link rel="stylesheet" type="text/css" href="styles.css">         -->              </head>                <body>                  <h2>文件下载内容:</h2><br/>          Dream.jpg:<a href="FileDownload.action?number=1">点击下载</a><br/>          jd2chm源码生成chm格式文档.rar:<a href="FileDownload.action?number=2">点击下载2</a>                            </body>      </html>  







0 0
原创粉丝点击