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

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

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

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

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

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

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:

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

例子的代码结构:

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文件来实现下载

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>

程序目录结构:

3、批量下载

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

4、断点续传

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

附件源码:

java实现文件的上传和下载的更多相关文章

  1. java客户端文件的上传和下载

    java客户端文件的上传和下载 //上传 public JTable upload(String id){ JTable table=new JTable(); System.out.println( ...

  2. Java中文件的上传与下载

    文件的上传与下载主要用到两种方法: 1.方法一:commons-fileupload.jar  commons-io.jar apache的commons-fileupload实现文件上传,下载 [u ...

  3. java实现文件的上传与下载

    (一)文件的上传:在这一部分,我要将execl文件的内容上传到数据库中,完成这一功能.需要分为两步: 1:将文件上传到tomcat下 文件格式如下: 2:读取execl表中的内容到数据库中 首先:下载 ...

  4. java+实现文件的上传和下载

    项目截图 路径配置 将localhost:8080/up6全部替换为实际项目路径 使用mysql文件夹下的脚本创建数据表. 创建后可以在数据库中看到创建好的数据表 2.修改数据库连接 3.修改上传地址 ...

  5. java+web文件的上传和下载代码

    一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不能这样上传了.我这里分享一下我自己开发的一套大文件上传控件 ...

  6. java实现ftp文件的上传与下载

    最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...

  7. 初学Java Web(7)——文件的上传和下载

    文件上传 文件上传前的准备 在表单中必须有一个上传的控件 <input type="file" name="testImg"/> 因为 GET 方式 ...

  8. java web(四):request、response一些用法和文件的上传和下载

    上一篇讲了ServletContent.ServletCOnfig.HTTPSession.request.response几个对象的生命周期.作用范围和一些用法.今天通过一个小项目运用这些知识.简单 ...

  9. java 文件的上传和下载

    主要介绍使用 smartupload.jar 包中的方法对文件的上传和下载.上传时文件是存放在服务器中,我用的是tamcat. 首先建立一个servlet 类,对文件的操作 package com.d ...

随机推荐

  1. LimeSDR Getting Started Quickly | LimeSDR上手指南

    0x00 概览 LimeSDR部分特性: USB 3.0 : 4 x Tx 发射天线接口 6 x Rx 接收天线接口: 可用于Wi-Fi, GSM, UMTS, LTE, LoRa, Bluetoot ...

  2. 本周java学习

    本周学习的内容让我又进一步实践了java语言,我本周学到的内容是   循环: 强制结束命令行 //Ctrl+c for 循环的无限循环形式: for( ; ; )() while循环的无限循环形式: ...

  3. 莫烦tensorflow(3)-Variable

    import tensorflow as tf state = tf.Variable(0,name='counter') one = tf.constant(1) new_value = tf.ad ...

  4. IOS safari 浏览器 时间乱码(ios时间显示NaN) 问题解决

    问题一: 项目中遇到一个关于日期时间在ios中乱码在安卓中安然无恙的问题,焦躁了半天 问题如上图,通过用户选择的时间和当天的天数相加然后在ios上就是乱码 这个界面运用了日期类型的计算,当我们用Jav ...

  5. 【转】 纯技术帖:MMOG网络同步算法揭秘

    http://www.360doc.com/content/12/0723/11/110467_225954142.shtml 来源:网络 概述 游戏发展从单机游戏到局域网游戏再到mmog(Massi ...

  6. 读懂TCP状态转移

    读懂TCP状态转移过程,对理解网络编程颇有帮助,本文将对TCP状态转移过程进行介绍,但各状态(总共11个)含义不在本文介绍的范围,请参考文末的书目列表. TCP状态转换图(state transiti ...

  7. Scrum_Sprint

    1.计划会议过程 经过一天的讨论研究,我们对该项目进行了需求分析,确定了这周所要实现的各个功能 并做好了任务看板,并将项目的各个功能分成一个个任务,进行了初步的分工 2.backlog BACKLOG ...

  8. CodeForces - 441E:Valera and Number (DP&数学期望&二进制)

    Valera is a coder. Recently he wrote a funny program. The pseudo code for this program is given belo ...

  9. How to do distributed locking

    How to do distributed locking 怎样做可靠的分布式锁,Redlock 真的可行么? 本文是对 Martin Kleppmann 的文章 How to do distribu ...

  10. Version Control 版本控制

    一.version control是什么: version control版本控制,是指对软件开发过程中各种程序代码.配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一. 二.versi ...