zoukankan      html  css  js  c++  java
  • java实现文件的上传和下载

    1、 servlet 如何实现文件的上传和下载?

    1.1上传文件

    参考自:http://blog.csdn.net/hzc543806053/article/details/7524491

    通过前台选择文件,然后将资源上传到(即新建一个文件)到发布的资源文件下面,

    下载就是url 到发布的资源文件,触发即可自动下载。服务器已经封装了如何下载的底层实现。(此处用的是tomcat)
    JSP上传文件方法: 关于在HTTP request 中通过Post方法提交文件的规范,该项目性能稳定快速,易于部署和使用.本次教程以前端jsp + 后端 servlet的方式,利用JSP上传文件,你也可以完全在jsp中实现而不用servlet.

    在开始JSP上传文件之前你要准备以下几个东西:

    1. commons-FileUpload 1.3 包

    下载地址:http://jakarta.apache.org/commons/fileupload/

    2. commons-IO 2.5 包

    下载地址:http://jakarta.apache.org/commons/io/ 

    有了上面这些东西我们就可以开始了

    1. 新建一个叫Servlet_UploadDownLoad的WEB项目

    2. 接着把这两个jar包放到WEB-INF/lib目录中:

    3.接下来我们要准备一份如下内容的upload.jsp文件,用来选择要上传的文件,

    
    
    1. <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
    2. <%
    3. String path = request.getContextPath();
    4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    5. %>
    6.  
    7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    8. <html> 
    9. <head> 
    10. <title>Jsp+Servlet upload file</title> 
    11. </head> 
    12. <body> 
    13.   <form action="UploadServlet" method="POST" enctype="multipart/form-data"> 
    14.     <input type ="file" name="file1" id="file1"/><br/> 
    15.     <input type ="file" name="file2" if="file2"/><br/> 
    16.     <input type ="file" name="file3" id="file3"/><br/> 
    17.     <input type="submit" value="Submit" /><br/> 
    18.     <input type="reset" /> 
    19.   </form> 
    20. </body> 
    21. </html> 

    上面文件中有几个需要注意的地方就是

    1. action="UploadServlet" 必须和后面的web.xml配置文件中对servlet映射必须保持一致.

    2. method="POST" 这里必须为"POST"方式提交不能是"GET".

    3. enctype="multipart/form-data" 这里是要提交的内容格式,表示你要提交的是数据流,而不是普通的表单文本.

    4. file1,file2,file3表示你要3个文件一起上传,你也可以一次只上传一个文件.


    接下来我们要写一个与上面这个upload.jsp配套的servlet程序,就叫做UploadServlet.java

    
    
    1.  import java.io.File;
    2. import java.io.*;
    3. import java.io.IOException;
    4. import java.io.PrintWriter;
    5. import java.util.List;
    6.  
    7. import javax.servlet.ServletException;
    8. import javax.servlet.http.HttpServlet;
    9. import javax.servlet.http.HttpServletRequest;
    10. import javax.servlet.http.HttpServletResponse;
    11.  
    12. import org.apache.commons.fileupload.FileItem;
    13. import org.apache.commons.fileupload.FileUploadException;
    14. import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    15. import org.apache.commons.fileupload.servlet.ServletFileUpload;
    16. /**
    17.  * 
    18.  * @author Administrator 文件上传 具体步骤: 1)获得磁盘文件条目工厂 DiskFileItemFactory 要导包 2) 利用
    19.  *         request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同 3)对
    20.  *         DiskFileItemFactory 对象设置一些 属性 4)高水平的API文件上传处理 ServletFileUpload
    21.  *         upload = new ServletFileUpload(factory); 目的是调用
    22.  *         parseRequest(request)方法 获得 FileItem 集合list ,
    23.  * 
    24.  *         5)在 FileItem 对象中 获取信息, 遍历, 判断 表单提交过来的信息 是否是 普通文本信息 另做处理 6) 第一种. 用第三方
    25.  *         提供的 item.write( new File(path,filename) ); 直接写到磁盘上 第二种. 手动处理
    26.  * 
    27.  */
    28. public class UploadServlet extends HttpServlet {
    29.  
    30. public void doPost(HttpServletRequest request, HttpServletResponse response)
    31. throws ServletException, IOException {
    32. request.setCharacterEncoding("utf-8"); // 设置编码
    33. // 获得磁盘文件条目工厂
    34. DiskFileItemFactory factory = new DiskFileItemFactory();
    35. // 获取文件需要上传到的路径
    36. String path = request.getRealPath("/uploadFile");
    37. // 如果没以下两行设置的话,上传大的 文件 会占用 很多内存,
    38. // 设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同
    39. /**
    40.  * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem
    41.  * 格式的 然后再将其真正写到 对应目录的硬盘上
    42.  */
    43. factory.setRepository(new File(path));
    44. // 设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室
    45. factory.setSizeThreshold(1024 * 1024);
    46. // 高水平的API文件上传处理
    47. ServletFileUpload upload = new ServletFileUpload(factory);
    48. try {
    49. // 可以上传多个文件
    50. List<FileItem> list = (List<FileItem>) upload.parseRequest(request);
    51. for (FileItem item : list) {
    52. // 获取表单的属性名字
    53. String name = item.getFieldName();
    54. // 如果获取的 表单信息是普通的 文本 信息
    55. if (item.isFormField()) {
    56. // 获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的
    57. String value = item.getString();
    58. request.setAttribute(name, value);
    59. } else {// 对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些
    60. /**
    61.  * 以下三步,主要获取 上传文件的名字
    62.  */
    63. // 获取路径名
    64. String value = item.getName();
    65. // 索引到最后一个反斜杠
    66. int start = value.lastIndexOf("\");
    67. // 截取 上传文件的 字符串名字,加1是 去掉反斜杠,
    68. String filename = value.substring(start + 1);
    69. request.setAttribute(name, filename);
    70. // 真正写到磁盘上
    71. // 它抛出的异常 用exception 捕捉
    72. // item.write( new File(path,filename) );//第三方提供的
    73. // 手动写的
    74. OutputStream out = new FileOutputStream(new File(path,
    75. filename));
    76. InputStream in = item.getInputStream();
    77. int length = 0;
    78. byte[] buf = new byte[1024];
    79. System.out.println("获取上传文件的总共的容量:" + item.getSize());
    80. // in.read(buf) 每次读到的数据存放在 buf 数组中
    81. while ((length = in.read(buf)) != -1) {
    82. // 在 buf 数组中 取出数据 写到 (输出流)磁盘上
    83. out.write(buf, 0, length);
    84. }
    85. in.close();
    86. out.close();
    87. }
    88. }
    89. } catch (FileUploadException e) {
    90. // TODO Auto-generated catch block
    91. e.printStackTrace();
    92. } catch (Exception e) {
    93. // TODO Auto-generated catch block
    94. // e.printStackTrace();
    95. }
    96. }
    97. }

    upload.jsp文件有了,配套的servlet也有了,现在最后剩下的就是怎么让它们配合工作了,接着我们把WEB-INF/web.xml文件请出来,并在该文件中加入以下内容:

    
    
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app version="2.5" 
    3. xmlns="http://java.sun.com/xml/ns/javaee" 
    4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    7.   <display-name></display-name>
    8.   <welcome-file-list>
    9.     <welcome-file>upload.jsp</welcome-file>
    10.   </welcome-file-list>
    11.   
    12.   <servlet> 
    13.     <servlet-name>UploadServlet</servlet-name> 
    14.     <servlet-class>UploadServlet</servlet-class> 
    15.   </servlet> 
    16.   <servlet-mapping> 
    17.     <servlet-name>UploadServlet</servlet-name> 
    18.     <url-pattern>/UploadServlet</url-pattern> 
    19.   </servlet-mapping> 
    20.   
    21. </web-app>

    写好以后再点击"保存"

    把你的upload项目整个拷贝到tomcat的webapps目录下,启动tomcat.打开IE浏览器在地址栏中输入http://localhost:8080/Servlet_UploadDownLoad/upload.jsp怎么样看到JSP上传文件的输入框了吗? 什么,没有看到,出错了! 你仔细检查一下步骤有没有对.

    好了,现在我们点击页面上的"浏览"按钮,找到我们要上传的文件,最后点击"Submit",太激动了,还不看一下你的I:\updir里面有没有你要的东西.

    1.2下载文件 

    1)通过超链接实现下载

    在HTML网页中,通过超链接链接到要下载的文件的地址:downloadOne.jsp
    
    
    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    2. <%
    3. String path = request.getContextPath();
    4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    5. %>
    6.  
    7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    8. <html>  
    9. <head>  
    10. <meta charset="UTF-8">  
    11. <title>通过链接下载文件</title>  
    12. </head>  
    13. <body>  
    14. <h1>通过链接下载文件</h1>  
    15. <a href="/Servlet_UploadDownLoad/file/commons-beanutils-1.9.3-bin.zip">压缩包</a>  
    16. <a href="/Servlet_UploadDownLoad/file/Koala.jpg">图片</a>  
    17. </body>  
    18. </html>  

    "/Servlet_UploadDownLoad/file/commons-beanutils-1.9.3-bin.zip"是文件路径,程序结构如下图:

     程序运行后,可以通过单击需要下载文档实现下载

    但是这里会出现一个问题,就是单击下载压缩包的时候会弹出下载页面,但是下载图片的时候浏览器就直接打开了图片,没有下载。

     

     这是因为通过超链接下载文件时,如果浏览器可以识别该文件格式,浏览器就会直接打开。只有浏览器不能识别该文件格式的时候,才会实现下载。

    因此利用第二种方法实现下载功能。 

    2)通过Servlet程序实现下载

       通过Servlet下载文件的原理是通过servlet读取目标程序,将资源返回客户端。

    downloadTwo.jsp

    
    
    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    2. <%
    3. String path = request.getContextPath();
    4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    5. %>
    6.  
    7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    8. <html>  
    9. <head>  
    10. <meta charset="UTF-8">  
    11. <title>通过链接下载文件</title>  
    12. </head>  
    13. <body>  
    14. <h1>通过链接下载文件</h1>  
    15. <a href="/Servlet_UploadDownLoad/file/commons-beanutils-1.9.3-bin.zip">压缩包</a>  
    16. <a href="/Servlet_UploadDownLoad/file/Koala.jpg">图片</a>  
    17. <h1>通过servlet程序下载文件</h1>  
    18. <a href="/Servlet_UploadDownLoad/ServletDownload?filename=commons-beanutils-1.9.3-bin.zip">压缩包</a>  
    19. <a href="/Servlet_UploadDownLoad/ServletDownload?filename=Koala.jpg">图片</a> 
    20. </body>  
    21. </html>  
    其中,/Servlet_UploadDownLoad 是servlet程序的映射路径
    然后新建一个servlet,名称为ServletDownload,URL映射为/ServletDownload

     

     

     web.xml :

    
    
    1.  <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app version="2.5" 
    3. xmlns="http://java.sun.com/xml/ns/javaee" 
    4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    7.   <display-name></display-name>
    8.   <welcome-file-list>
    9.     <welcome-file>upload.jsp</welcome-file>
    10.   </welcome-file-list>
    11.   
    12.   <servlet> 
    13.     <servlet-name>UploadServlet</servlet-name> 
    14.     <servlet-class>UploadServlet</servlet-class> 
    15.   </servlet>
    16.   <servlet>
    17.     <description>ServletDownload</description>
    18.     <display-name>ServletDownload</display-name>
    19.     <servlet-name>ServletDownload</servlet-name>
    20.     <servlet-class>ServletDownload</servlet-class>
    21.   </servlet>
    22.  
    23.   <servlet-mapping> 
    24.     <servlet-name>UploadServlet</servlet-name> 
    25.     <url-pattern>/UploadServlet</url-pattern> 
    26.   </servlet-mapping>
    27.   <servlet-mapping>
    28.     <servlet-name>ServletDownload</servlet-name>
    29.     <url-pattern>/ServletDownload</url-pattern>
    30.   </servlet-mapping> 
    31.   
    32. </web-app>

     ServletDownload.java :

    
    
    1.  import java.io.FileInputStream;
    2. import java.io.IOException;
    3. import java.io.InputStream;
    4. import java.io.OutputStream;
    5. import java.io.PrintWriter;
    6.  
    7. import javax.servlet.ServletException;
    8. import javax.servlet.http.HttpServlet;
    9. import javax.servlet.http.HttpServletRequest;
    10. import javax.servlet.http.HttpServletResponse;
    11.  
    12.  
    13. public class ServletDownload extends HttpServlet {
    14.  
    15. /**
    16.  * Constructor of the object.
    17.  */
    18. public ServletDownload() {
    19. super();
    20. }
    21.  
    22. /**
    23.  * The doGet method of the servlet. <br>
    24.  *
    25.  * This method is called when a form has its tag value method equals to get.
    26.  * 
    27.  * @param request the request send by the client to the server
    28.  * @param response the response send by the server to the client
    29.  * @throws ServletException if an error occurred
    30.  * @throws IOException if an error occurred
    31.  */
    32. public void doGet(HttpServletRequest request, HttpServletResponse response)
    33. throws ServletException, IOException {
    34. //获得请求文件名  
    35.         String filename = request.getParameter("filename");  
    36.         System.out.println(filename);  
    37.         //设置文件MIME类型  
    38.         response.setContentType(getServletContext().getMimeType(filename));  
    39.         //设置Content-Disposition  
    40.         response.setHeader("Content-Disposition", "attachment;filename="+filename);  
    41.         //读取目标文件,通过response将目标文件写到客户端  
    42.         //获取目标文件的绝对路径  
    43.         String fullFileName = getServletContext().getRealPath("/file/" + filename);  
    44.         //System.out.println(fullFileName);  
    45.         //读取文件  
    46.         InputStream in = new FileInputStream(fullFileName);  
    47.         OutputStream out = response.getOutputStream();  
    48.         //写文件  
    49.         int b;  
    50.         while((b=in.read())!= -1)  
    51.         {  
    52.             out.write(b);  
    53.         }  
    54.         in.close();  
    55.         out.close();  
    56. }
    57.  
    58. /**
    59.  * The doPost method of the servlet. <br>
    60.  *
    61.  * This method is called when a form has its tag value method equals to post.
    62.  * 
    63.  * @param request the request send by the client to the server
    64.  * @param response the response send by the server to the client
    65.  * @throws ServletException if an error occurred
    66.  * @throws IOException if an error occurred
    67.  */
    68. public void doPost(HttpServletRequest request, HttpServletResponse response)
    69. throws ServletException, IOException {
    70. }
    71. }

     重启tomcat服务器,即可实现对压缩包和对图片的下载。

     2、struts如何实现文件的上传和下载?

    2.1struts上传文件

    先新建web project ,然后Add Struts Capabilties:

     

     

    struts.xml  的配置:

    
    
    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
    3. <struts>
    4. <!--使用Struts2进行文件上传的时候,Struts2默认文件大小最大为2MB,如果要传大一点的文件,就需要修改struts.xml配置文件,重新设置能够上传的最大的文件大小。-->  
    5. <!-- Struts2全局配置 -->  
    6.     <!-- 修改上传的最大文件大小:100MB -->  
    7.     <constant name="struts.multipart.maxSize" value="104857600"/>
    8.  
    9. <package name="upload" extends="struts-default">
    10. <!-- 文件上传的拦截器栈 (只允许上传图片文件)-->
    11. <interceptors>
    12. <interceptor-stack name="fileUploadStack">
    13. <interceptor-ref name="fileUpload">
    14. <param name="allowedTypes">image/pjpeg,image/bmp,image/jpg,image/png,image/gif,image/jpeg</param>
    15. </interceptor-ref>
    16. <interceptor-ref name="basicStack" />
    17. </interceptor-stack>
    18. </interceptors>
    19. <default-interceptor-ref name="fileUploadStack"></default-interceptor-ref>
    20. <action name="upload" class="com.action.UploadAction.UploadAction">
    21. <result name="success">/success.jsp</result>
    22. <result name="input">/upload.jsp</result>
    23. <interceptor-ref name="fileUploadStack"></interceptor-ref>
    24. </action>
    25. </package>
    26. </struts>    

     upload.jsp :

    
    
    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    2. <%@ taglib prefix="s" uri="/struts-tags"%>
    3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    4. <html> 
    5. <head> 
    6. <title>Jsp+Struts2 upload file</title> 
    7. </head> 
    8. <body> 
    9. <h1 style="color: red;">【请选择图片进行上传】</h1>
    10.     <form action="upload.action" theme="simple" enctype="multipart/form-data" method="post">
    11.     <input type ="file" name="file"/><br/> 
    12.     <input type ="file" name="file"/><br/> 
    13.     <input type ="file" name="file"/><br/> 
    14.     <input type="submit" value="Submit" /><br/> 
    15.     <input type="reset" /> 
    16.     </form> 
    17. </body> 
    18. </html>  

      <form action="upload.action" theme="simple" enctype="multipart/form-data" method="post"> 

    表单中enctype="multipart/form-data"的意思,是设置表单的MIME 编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart /form-data,才能完整的传递文件数据,进行下面的操作. enctype="multipart/form-data"是上传二进制数据; form里面的input的值以2进制的方式传过去。
     theme="simple"是struts2 的一个最简单的主题,这样你的标签就生成最简单的HTML元素 不会生成额外的内容

    <input type="file" name="file" />

    【这里的name一定要与action类里面的name名字一致,set/get】

    success.jsp

    
    
    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    2. <%
    3. String path = request.getContextPath();
    4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    5. %>
    6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    7. <html>
    8.   <head>
    9.     <base href="<%=basePath%>">
    10.     <title>上传图片成功 </title>
    11.   </head>
    12.   <body>
    13.       上传图片成功 !!!<br>
    14.   </body>
    15. </html>

    web.xml

    
    
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app version="2.5" 
    3. xmlns="http://java.sun.com/xml/ns/javaee" 
    4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    7.   <display-name></display-name>
    8.   <welcome-file-list>
    9.     <welcome-file>upload.jsp</welcome-file>
    10.   </welcome-file-list>
    11.   <filter>
    12.    <filter-name>struts2</filter-name>
    13.    <filter-class>
    14.    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    15.    </filter-class>
    16.   </filter>
    17.   <filter-mapping>
    18.    <filter-name>struts2</filter-name>
    19.    <url-pattern>/*</url-pattern>
    20.   </filter-mapping>
    21.   
    22. </web-app>

    UploadAction.java

    
    
    1.  package com.action.UploadAction;
    2.  
    3. import java.io.File;
    4. import java.util.ArrayList;
    5. import java.util.List;
    6.  
    7. import com.file.util.Upload;
    8. import com.opensymphony.xwork2.ActionSupport;
    9.  
    10.  
    11. public class UploadAction extends ActionSupport {
    12. private List<File> file;
    13. private List<String> fileFileName;
    14. private List<String> fileContentType;
    15.  
    16. public List<File> getFile() {
    17. return file;
    18. }
    19.  
    20. public void setFile(List<File> file) {
    21. this.file = file;
    22. }
    23.  
    24. public List<String> getFileFileName() {
    25. return fileFileName;
    26. }
    27.  
    28. public void setFileFileName(List<String> fileFileName) {
    29. this.fileFileName = fileFileName;
    30. }
    31.  
    32. public List<String> getFileContentType() {
    33. return fileContentType;
    34. }
    35.  
    36. public void setFileContentType(List<String> fileContentType) {
    37. this.fileContentType = fileContentType;
    38. }
    39.  
    40. @Override
    41. public String execute() throws Exception {
    42. Upload upload = new Upload();
    43. ArrayList list = upload.upload(file, this.getFileFileName(), "/files/");
    44. if (list.size() > 0) {
    45. return SUCCESS;
    46. }else {
    47. return INPUT;
    48. }
    49. }
    50. }

     Upload.java

    
    
    1.  package com.file.util;
    2.  
    3. import java.io.File;
    4. import java.io.FileInputStream;
    5. import java.io.FileOutputStream;
    6. import java.io.IOException;
    7. import java.io.InputStream;
    8. import java.io.OutputStream;
    9. import java.text.SimpleDateFormat;
    10. import java.util.ArrayList;
    11. import java.util.Date;
    12. import java.util.List;
    13. import org.apache.struts2.ServletActionContext;
    14.  
    15. public class Upload {
    16. @SuppressWarnings("unchecked")
    17. /*
    18.  * @file:文件域列表
    19.  * 
    20.  * @fileName:上传文件的文件名
    21.  * 
    22.  * @path:文件上传的目录,相对目录。 说明:文件上传所存放目录的规则:网站根目录下 files/会员ID/网站类型名称/上传文件分类名称/
    23.  * 
    24.  * @返回结果:一个存放上传文件所在位置相对路径的ArrayList
    25.  */
    26. public ArrayList upload(List file, List fileName, String path)
    27. throws IOException {
    28. // String root = ServletActionContext.getRequest().getRealPath(path);
    29. String root = ServletActionContext.getServletContext()
    30. .getRealPath(path);
    31. File dir = new File(root);
    32. if (dir.exists() == false) {
    33. dir.mkdirs();
    34. }
    35. ArrayList list = new ArrayList();
    36. for (int i = 0; i < file.size(); ++i) {
    37. InputStream is = new FileInputStream(file.get(i).toString());
    38. /*
    39.  * SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");//
    40.  * 格式化时间输出 String Rname = sdf.format(new Date());//
    41.  * 取得当前时间,Date()是java.util包里的,这作为真实名称 name = Rname + name;//
    42.  * 重命名文件名称,命名规则为:时间+原文件名称
    43.  */
    44. String name = fileName.get(i).toString();// 得到上传文件的原名称
    45. File destFile = new File(root, name);
    46. OutputStream os = new FileOutputStream(destFile);
    47. byte[] buffer = new byte[400];
    48. int length = 0;
    49. while ((length = is.read(buffer)) > 0) {
    50. os.write(buffer, 0, length);
    51. }
    52. list.add(path + name);
    53. is.close();
    54. os.close();
    55. }
    56. return list;
    57. }
    58. }

     mkdirs()可以建立多级文件夹, mkdir()只会建立一级的文件夹, 如下:

    new File("/tmp/one/two/three").mkdirs();

    执行后, 会建立tmp/one/two/three四级目录

    new File("/tmp/one/two/three").mkdir();

    则不会建立任何目录, 因为找不到/tmp/one/two目录, 结果返回false

    例子的代码结构:

     

    2.2struts下载文件

    方法一:通过配置struts.xml文件

     DownloadAction.java

     

    
    
    1. package com.action.DownloadAction;
    2.  
    3. import java.io.InputStream;
    4. import org.apache.struts2.ServletActionContext;
    5. import com.opensymphony.xwork2.ActionSupport;
    6.  
    7. //文件下载  
    8. public class DownloadAction extends ActionSupport {
    9.  
    10. private String fileName;
    11.  
    12. public String getFileName() {
    13. return fileName;
    14. }
    15.  
    16. public void setFileName(String fileName) {
    17. this.fileName = fileName;
    18. }
    19.  
    20. // 返回一个输入流,作为一个客户端来说是一个输入流,但对于服务器端是一个 输出流
    21. public InputStream getDownloadFile() throws Exception {
    22. //解决中文乱码,get方式提交的参数编码,只支持iso8859-1编码,UTF-8是前台jsp页面的编码格式
    23. this.fileName = new String(this.fileName.getBytes("ISO-8859-1"), "UTF-8");
    24. String path = "downloadFile/"+this.fileName;//要下载的文件路径
    25. //重新转换成ISO-8859-1,下载文件的时候展示的文件名
    26. this.fileName = new String(this.fileName.getBytes("UTF-8"), "ISO-8859-1");
    27. return ServletActionContext.getServletContext().getResourceAsStream(path);
    28. }
    29.  
    30. public String execute() throws Exception {
    31. return SUCCESS;
    32. }
    33. }

    struts.xml

    
    
    1.  <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
    3. <struts>
    4. <!--使用Struts2进行文件上传的时候,Struts2默认文件大小最大为2MB,如果要传大一点的文件,就需要修改struts.xml配置文件,重新设置能够上传的最大的文件大小。-->  
    5. <!-- Struts2全局配置 -->  
    6.     <!-- 修改上传的最大文件大小:100MB -->  
    7.     <constant name="struts.multipart.maxSize" value="104857600"/>
    8.  
    9. <package name="upload" extends="struts-default">
    10. <!-- 文件上传的拦截器栈 (只允许上传图片文件)-->
    11. <interceptors>
    12. <interceptor-stack name="fileUploadStack">
    13. <interceptor-ref name="fileUpload">
    14. <param name="allowedTypes">image/pjpeg,image/bmp,image/jpg,image/png,image/gif,image/jpeg</param>
    15. </interceptor-ref>
    16. <interceptor-ref name="basicStack" />
    17. </interceptor-stack>
    18. </interceptors>
    19. <default-interceptor-ref name="fileUploadStack"></default-interceptor-ref>
    20. <action name="upload" class="com.action.UploadAction.UploadAction">
    21. <result name="success">/success.jsp</result>
    22. <result name="input">/upload.jsp</result>
    23. <interceptor-ref name="fileUploadStack"></interceptor-ref>
    24. </action>
    25. </package>
    26. <package name="download" extends="struts-default">        
    27.        <action name="download" class="com.action.DownloadAction.DownloadAction">  
    28.            <result name="success" type="stream">  
    29.                <param name="contentType">text/plain</param>  
    30.                <param name="contentDisposition">attachment;fileName="${fileName}"</param>  
    31.                <param name="inputName">DownloadFile</param>  
    32.                <param name="bufferSize">1024</param>  
    33.            </result>  
    34.        </action>  
    35.    </package>  
    36. </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名字要和DownloadAction.java类中的getDownloadFile()方法名去掉get 一致

     

    Struts2下载文件实现的说明

    contentType

      内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片

    inputName

      下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的属性需要编写getInputStream()方法

    contentDisposition

      文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值为:

    attachment;filename="struts2.txt",表示文件下载的时候保存的名字应为struts2.txt。如果直接写filename="struts2.txt",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline;filename="struts2.txt"

    bufferSize

      下载缓冲区的大小

     

     downloadOne.jsp

    
    
    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
    2. <%  
    3. String path = request.getContextPath();  
    4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
    5. %>  
    6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    7. <html>  
    8.   <head>  
    9.      <title>Struts下载文件</title>  
    10.   </head>  
    11.   <body>  
    12.     <h2>文件下载内容:</h2><br/>  
    13.     1.jpg:<a href="download.action?fileName=1.jpg">点击下载</a><br/>  
    14.     2.jpg:<a href="download.action?fileName=2.jpg">点击下载2</a><br/>  
    15.        中文1.jpg:<a href="download.action?fileName=中文1.jpg">点击下载中文1.jpg</a><br/>    
    16.        中文2.jpg:<a href="download.action?fileName=中文2.jpg">点击下载中文2.jpg</a><br/>    
    17.   </body>  
    18. </html>  

     例子的代码结构: 

     

     方法二

    方法二:通过配置java文件来实现下载

     DownloadByJavaAction.java

    
    
    1.  package com.action.DownloadAction;
    2.  
    3. import java.io.BufferedInputStream;
    4. import java.io.BufferedOutputStream;
    5. import java.io.File;
    6. import java.io.FileInputStream;
    7. import java.io.InputStream;
    8.  
    9. import javax.servlet.http.HttpServletResponse;
    10.  
    11. import org.apache.struts2.ServletActionContext;
    12.  
    13. import com.opensymphony.xwork2.ActionSupport;
    14.  
    15. public class DownloadByJavaAction  extends ActionSupport {
    16. private String fileName;
    17.  
    18. public String getFileName() {
    19. return fileName;
    20. }
    21.  
    22. public void setFileName(String fileName) {
    23. this.fileName = fileName;
    24. }
    25. public void download() throws Exception{
    26. /**
    27.  * 配置文件路径
    28.  */
    29. String realPath = ServletActionContext.getRequest().getRealPath("/");
    30. String path = getText("/downloadFile/");
    31. //解决中文乱码,get方式提交的参数编码,只支持iso8859-1编码,UTF-8是前台jsp页面的编码格式
    32. fileName = new String(fileName.getBytes("ISO-8859-1"), "UTF-8");
    33. File file = new File(realPath+path+fileName);
    34. InputStream in = new FileInputStream(file);
    35. //重新转换成ISO-8859-1,下载文件的时候展示的文件名
    36. fileName = new String(this.fileName.getBytes("UTF-8"), "ISO-8859-1");
    37. /**
    38.  * 配置下载参数,下载文件
    39.  */
    40. BufferedInputStream input = null;
    41. BufferedOutputStream output = null;
    42. try {
    43. HttpServletResponse response = ServletActionContext.getResponse();
    44. response.setCharacterEncoding("utf-8");
    45. response.setContentType("application/x-download");// 设置为下载application/x-download
    46. response.addHeader("content-type", "application/x-msdownload");
    47. response.setHeader("Content-Disposition", "attachment; filename="
    48. + fileName);
    49. response.setContentType("application/octet-stream");
    50. input = new BufferedInputStream(in);
    51. output = new BufferedOutputStream(response.getOutputStream());
    52. byte[] buff = new byte[4096];
    53. int n = 0;
    54. while ((= input.read(buff)) != -1) {
    55. output.write(buff, 0, n);
    56. }
    57. output.flush();
    58. } catch (Exception e) {
    59. } finally {
    60. try {
    61. if (output != null) {
    62. output.close();
    63. output = null;
    64. }
    65. if (input != null) {
    66. input.close();
    67. input = null;
    68. }
    69. if (in != null) {
    70. in.close();
    71. in = null;
    72. }
    73. } catch (Exception e) {
    74. e.printStackTrace();
    75. }
    76. }
    77. }
    78. }

     downloadByJava.jsp

    
    
    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
    2. <%  
    3. String path = request.getContextPath();  
    4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
    5. %>  
    6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    7. <html>  
    8.   <head>  
    9.      <title>Struts下载文件(java实现)</title>  
    10.   </head>  
    11.   <body>  
    12.     <h2 style="color:red;">JAVA实现</h2>
    13.     <h2>文件下载内容:</h2><br/>  
    14.     1.jpg:<a href="downloadByJava!download.action?fileName=1.jpg">点击下载</a><br/>  
    15.     2.jpg:<a href="downloadByJava!download.action?fileName=2.jpg">点击下载2</a><br/>  
    16.            中文1.jpg:<a href="downloadByJava!download.action?fileName=中文1.jpg">点击下载中文1.jpg</a><br/>    
    17.            中文2.jpg:<a href="downloadByJava!download.action?fileName=中文2.jpg">点击下载中文2.jpg</a><br/>    
    18.   </body>  
    19. </html>  

     struts.xml

    
    
    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
    3. <struts>
    4. <!--使用Struts2进行文件上传的时候,Struts2默认文件大小最大为2MB,如果要传大一点的文件,就需要修改struts.xml配置文件,重新设置能够上传的最大的文件大小。-->  
    5. <!-- Struts2全局配置 -->  
    6.     <!-- 修改上传的最大文件大小:100MB -->  
    7.     <constant name="struts.multipart.maxSize" value="104857600"/>
    8.  
    9. <package name="upload" extends="struts-default">
    10. <!-- 文件上传的拦截器栈 (只允许上传图片文件)-->
    11. <interceptors>
    12. <interceptor-stack name="fileUploadStack">
    13. <interceptor-ref name="fileUpload">
    14. <param name="allowedTypes">image/pjpeg,image/bmp,image/jpg,image/png,image/gif,image/jpeg</param>
    15. </interceptor-ref>
    16. <interceptor-ref name="basicStack" />
    17. </interceptor-stack>
    18. </interceptors>
    19. <default-interceptor-ref name="fileUploadStack"></default-interceptor-ref>
    20. <action name="upload" class="com.action.UploadAction.UploadAction">
    21. <result name="success">/success.jsp</result>
    22. <result name="input">/upload.jsp</result>
    23. <interceptor-ref name="fileUploadStack"></interceptor-ref>
    24. </action>
    25. </package>
    26. <package name="download" extends="struts-default">        
    27.    <!-- 通过配置struts.xml文件实现下载 -->
    28.        <action name="download" class="com.action.DownloadAction.DownloadAction">  
    29.            <result name="success" type="stream">  
    30.                <param name="contentType">text/plain</param>  
    31.                <param name="contentDisposition">attachment;fileName="${fileName}"</param>  
    32.                <param name="inputName">DownloadFile</param>  
    33.                <param name="bufferSize">1024</param>  
    34.            </result>  
    35.        </action>  
    36.        <!-- 通过配置JAVA文件来实现下载 -->
    37.        <action name="downloadByJava"
    38. class="com.action.DownloadAction.DownloadByJavaAction">
    39. </action>
    40.    </package>  
    41. </struts>    

    程序目录结构:

      

    3、批量下载

            使用多线程并发调用单个文件的下载方法即可。

    4、断点续传

             有待研究。。。。。。。。。。

     

     附件源码:

  • 相关阅读:
    SOFA 源码分析 — 自动故障剔除
    Pod——状态和生命周期管理及探针和资源限制
    pause的作用
    k8s-部署策略
    linux-删除一个目录下的所有文件,但保留某个或者多个指定文件
    k8s-gitlab搭建
    git中报unable to auto-detect email address 错误的解决拌办法
    k8s-secret用法
    k8s-traefik默认80端口
    nginx和apache区别
  • 原文地址:https://www.cnblogs.com/yangcx666/p/8723884.html
Copyright © 2011-2022 走看看