java实现文件的上传和下载

时间:2023-01-27 10:53:38

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目录中:

java实现文件的上传和下载

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"是文件路径,程序结构如下图:

java实现文件的上传和下载

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

java实现文件的上传和下载

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

 

java实现文件的上传和下载

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

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

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

 

java实现文件的上传和下载

 

java实现文件的上传和下载

 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:

java实现文件的上传和下载

 

java实现文件的上传和下载

 

java实现文件的上传和下载

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

例子的代码结构:

java实现文件的上传和下载

 

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实现文件的上传和下载

 

java实现文件的上传和下载java实现文件的上传和下载 方法二

方法二:通过配置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>    

程序目录结构:

java实现文件的上传和下载

  

java实现文件的上传和下载

3、批量下载

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

4、断点续传

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

 

 附件源码: