java实现文件的上传和下载

时间:2022-11-01 06:16:10

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

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. <servlet>
  12. <servlet-name>UploadServlet</servlet-name>
  13. <servlet-class>UploadServlet</servlet-class>
  14. </servlet>
  15. <servlet-mapping>
  16. <servlet-name>UploadServlet</servlet-name>
  17. <url-pattern>/UploadServlet</url-pattern>
  18. </servlet-mapping>
  19. </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. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <meta charset="UTF-8">
  10. <title>通过链接下载文件</title>
  11. </head>
  12. <body>
  13. <h1>通过链接下载文件</h1>
  14. <a href="/Servlet_UploadDownLoad/file/commons-beanutils-1.9.3-bin.zip">压缩包</a>
  15. <a href="/Servlet_UploadDownLoad/file/Koala.jpg">图片</a>
  16. </body>
  17. </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. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <meta charset="UTF-8">
  10. <title>通过链接下载文件</title>
  11. </head>
  12. <body>
  13. <h1>通过链接下载文件</h1>
  14. <a href="/Servlet_UploadDownLoad/file/commons-beanutils-1.9.3-bin.zip">压缩包</a>
  15. <a href="/Servlet_UploadDownLoad/file/Koala.jpg">图片</a>
  16. <h1>通过servlet程序下载文件</h1>
  17. <a href="/Servlet_UploadDownLoad/ServletDownload?filename=commons-beanutils-1.9.3-bin.zip">压缩包</a>
  18. <a href="/Servlet_UploadDownLoad/ServletDownload?filename=Koala.jpg">图片</a>
  19. </body>
  20. </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. <servlet>
  12. <servlet-name>UploadServlet</servlet-name>
  13. <servlet-class>UploadServlet</servlet-class>
  14. </servlet>
  15. <servlet>
  16. <description>ServletDownload</description>
  17. <display-name>ServletDownload</display-name>
  18. <servlet-name>ServletDownload</servlet-name>
  19. <servlet-class>ServletDownload</servlet-class>
  20. </servlet>
  21. <servlet-mapping>
  22. <servlet-name>UploadServlet</servlet-name>
  23. <url-pattern>/UploadServlet</url-pattern>
  24. </servlet-mapping>
  25. <servlet-mapping>
  26. <servlet-name>ServletDownload</servlet-name>
  27. <url-pattern>/ServletDownload</url-pattern>
  28. </servlet-mapping>
  29. </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. import javax.servlet.ServletException;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. public class ServletDownload extends HttpServlet {
  11. /**
  12. * Constructor of the object.
  13. */
  14. public ServletDownload() {
  15. super();
  16. }
  17. /**
  18. * The doGet method of the servlet. <br>
  19. *
  20. * This method is called when a form has its tag value method equals to get.
  21. *
  22. * @param request the request send by the client to the server
  23. * @param response the response send by the server to the client
  24. * @throws ServletException if an error occurred
  25. * @throws IOException if an error occurred
  26. */
  27. public void doGet(HttpServletRequest request, HttpServletResponse response)
  28. throws ServletException, IOException {
  29. //获得请求文件名
  30. String filename = request.getParameter("filename");
  31. System.out.println(filename);
  32. //设置文件MIME类型
  33. response.setContentType(getServletContext().getMimeType(filename));
  34. //设置Content-Disposition
  35. response.setHeader("Content-Disposition", "attachment;filename="+filename);
  36. //读取目标文件,通过response将目标文件写到客户端
  37. //获取目标文件的绝对路径
  38. String fullFileName = getServletContext().getRealPath("/file/" + filename);
  39. //System.out.println(fullFileName);
  40. //读取文件
  41. InputStream in = new FileInputStream(fullFileName);
  42. OutputStream out = response.getOutputStream();
  43. //写文件
  44. int b;
  45. while((b=in.read())!= -1)
  46. {
  47. out.write(b);
  48. }
  49. in.close();
  50. out.close();
  51. }
  52. /**
  53. * The doPost method of the servlet. <br>
  54. *
  55. * This method is called when a form has its tag value method equals to post.
  56. *
  57. * @param request the request send by the client to the server
  58. * @param response the response send by the server to the client
  59. * @throws ServletException if an error occurred
  60. * @throws IOException if an error occurred
  61. */
  62. public void doPost(HttpServletRequest request, HttpServletResponse response)
  63. throws ServletException, IOException {
  64. }
  65. }

重启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. <package name="upload" extends="struts-default">
  9. <!-- 文件上传的拦截器栈 (只允许上传图片文件)-->
  10. <interceptors>
  11. <interceptor-stack name="fileUploadStack">
  12. <interceptor-ref name="fileUpload">
  13. <param name="allowedTypes">image/pjpeg,image/bmp,image/jpg,image/png,image/gif,image/jpeg</param>
  14. </interceptor-ref>
  15. <interceptor-ref name="basicStack" />
  16. </interceptor-stack>
  17. </interceptors>
  18. <default-interceptor-ref name="fileUploadStack"></default-interceptor-ref>
  19. <action name="upload" class="com.action.UploadAction.UploadAction">
  20. <result name="success">/success.jsp</result>
  21. <result name="input">/upload.jsp</result>
  22. <interceptor-ref name="fileUploadStack"></interceptor-ref>
  23. </action>
  24. </package>
  25. </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. </web-app>

UploadAction.java


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

Upload.java


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

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

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. <package name="upload" extends="struts-default">
  9. <!-- 文件上传的拦截器栈 (只允许上传图片文件)-->
  10. <interceptors>
  11. <interceptor-stack name="fileUploadStack">
  12. <interceptor-ref name="fileUpload">
  13. <param name="allowedTypes">image/pjpeg,image/bmp,image/jpg,image/png,image/gif,image/jpeg</param>
  14. </interceptor-ref>
  15. <interceptor-ref name="basicStack" />
  16. </interceptor-stack>
  17. </interceptors>
  18. <default-interceptor-ref name="fileUploadStack"></default-interceptor-ref>
  19. <action name="upload" class="com.action.UploadAction.UploadAction">
  20. <result name="success">/success.jsp</result>
  21. <result name="input">/upload.jsp</result>
  22. <interceptor-ref name="fileUploadStack"></interceptor-ref>
  23. </action>
  24. </package>
  25. <package name="download" extends="struts-default">
  26. <action name="download" class="com.action.DownloadAction.DownloadAction">
  27. <result name="success" type="stream">
  28. <param name="contentType">text/plain</param>
  29. <param name="contentDisposition">attachment;fileName="${fileName}"</param>
  30. <param name="inputName">DownloadFile</param>
  31. <param name="bufferSize">1024</param>
  32. </result>
  33. </action>
  34. </package>
  35. </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. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.InputStream;
  7. import javax.servlet.http.HttpServletResponse;
  8. import org.apache.struts2.ServletActionContext;
  9. import com.opensymphony.xwork2.ActionSupport;
  10. public class DownloadByJavaAction  extends ActionSupport {
  11. private String fileName;
  12. public String getFileName() {
  13. return fileName;
  14. }
  15. public void setFileName(String fileName) {
  16. this.fileName = fileName;
  17. }
  18. public void download() throws Exception{
  19. /**
  20. * 配置文件路径
  21. */
  22. String realPath = ServletActionContext.getRequest().getRealPath("/");
  23. String path = getText("/downloadFile/");
  24. //解决中文乱码,get方式提交的参数编码,只支持iso8859-1编码,UTF-8是前台jsp页面的编码格式
  25. fileName = new String(fileName.getBytes("ISO-8859-1"), "UTF-8");
  26. File file = new File(realPath+path+fileName);
  27. InputStream in = new FileInputStream(file);
  28. //重新转换成ISO-8859-1,下载文件的时候展示的文件名
  29. fileName = new String(this.fileName.getBytes("UTF-8"), "ISO-8859-1");
  30. /**
  31. * 配置下载参数,下载文件
  32. */
  33. BufferedInputStream input = null;
  34. BufferedOutputStream output = null;
  35. try {
  36. HttpServletResponse response = ServletActionContext.getResponse();
  37. response.setCharacterEncoding("utf-8");
  38. response.setContentType("application/x-download");// 设置为下载application/x-download
  39. response.addHeader("content-type", "application/x-msdownload");
  40. response.setHeader("Content-Disposition", "attachment; filename="
  41. + fileName);
  42. response.setContentType("application/octet-stream");
  43. input = new BufferedInputStream(in);
  44. output = new BufferedOutputStream(response.getOutputStream());
  45. byte[] buff = new byte[4096];
  46. int n = 0;
  47. while ((n = input.read(buff)) != -1) {
  48. output.write(buff, 0, n);
  49. }
  50. output.flush();
  51. } catch (Exception e) {
  52. } finally {
  53. try {
  54. if (output != null) {
  55. output.close();
  56. output = null;
  57. }
  58. if (input != null) {
  59. input.close();
  60. input = null;
  61. }
  62. if (in != null) {
  63. in.close();
  64. in = null;
  65. }
  66. } catch (Exception e) {
  67. e.printStackTrace();
  68. }
  69. }
  70. }
  71. }

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. <package name="upload" extends="struts-default">
  9. <!-- 文件上传的拦截器栈 (只允许上传图片文件)-->
  10. <interceptors>
  11. <interceptor-stack name="fileUploadStack">
  12. <interceptor-ref name="fileUpload">
  13. <param name="allowedTypes">image/pjpeg,image/bmp,image/jpg,image/png,image/gif,image/jpeg</param>
  14. </interceptor-ref>
  15. <interceptor-ref name="basicStack" />
  16. </interceptor-stack>
  17. </interceptors>
  18. <default-interceptor-ref name="fileUploadStack"></default-interceptor-ref>
  19. <action name="upload" class="com.action.UploadAction.UploadAction">
  20. <result name="success">/success.jsp</result>
  21. <result name="input">/upload.jsp</result>
  22. <interceptor-ref name="fileUploadStack"></interceptor-ref>
  23. </action>
  24. </package>
  25. <package name="download" extends="struts-default">
  26. <!-- 通过配置struts.xml文件实现下载 -->
  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. <!-- 通过配置JAVA文件来实现下载 -->
  36. <action name="downloadByJava"
  37. class="com.action.DownloadAction.DownloadByJavaAction">
  38. </action>
  39. </package>
  40. </struts>

程序目录结构:

java实现文件的上传和下载

java实现文件的上传和下载

3、批量下载

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

4、断点续传

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

附件源码: