JavaWeb实现文件下载

1. 编写文件上传Servlet

  1 public class FileUpload1 extends HttpServlet {
  2     @Override
  3     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  4
  5         InputStream in = null;
  6         OutputStream out = null;
  7
  8         // 获取上传文件目录
  9         String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
 10
 11         try {
 12             // 使用默认配置创建解析器工厂
 13             DiskFileItemFactory factory = new DiskFileItemFactory();
 14             // 获取解析器
 15             ServletFileUpload upload = new ServletFileUpload(factory);
 16             upload.setProgressListener(new ProgressListener() {
 17                 @Override
 18                 public void update(long l, long l1, int i) {
 19                     System.out.println("文件大小为:" + l1 + ",当前已处理:" + l);
 20                 }
 21             });
 22             // 解决上传文件名的中文乱码问题
 23             upload.setHeaderEncoding("UTF-8");
 24             // 上传表单是否为multipart/form-data类型
 25             if (!upload.isMultipartContent(request)) {
 26                 return;
 27             }
 28             // 解析request的输入流
 29             List<FileItem> fileItemList = upload.parseRequest(request);
 30             // 迭代list集合
 31             for (FileItem fileItem : fileItemList) {
 32                 if (fileItem.isFormField()) {
 33                     // 普通字段
 34                     String name = fileItem.getFieldName();
 35                     // 调用getString重载方法, 解决上传数据的中文乱码问题
 36                     String value = fileItem.getString("UTF-8");
 37                     System.out.println(name + "=" + value);
 38                 } else {
 39                     // 上传文件
 40                     // 获取上传文件名
 41                     String fileName = fileItem.getName();
 42                     // input:file没有指定上传文件时, 结束本次循环并继续下一次循环
 43                     if(fileName == null && fileName.trim().equals("")) {
 44                         continue;
 45                     }
 46                     fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
 47                     // 使用UUID作为上传文件的名称
 48                     fileName = makeFileName(fileName);
 49                     // 获取输入流
 50                     in = fileItem.getInputStream();
 51
 52                     // 上传文件名若不存在, 则先创建
 53                     File savePathDir = new File(savePath);
 54                     if (!savePathDir.exists()) {
 55                         savePathDir.mkdir();
 56                     }
 57
 58                     // 使用hash算法产生当前上传图片的随机目录
 59                     String currentFileSavePath = makePath(savePath, fileName);
 60
 61                     // 获取输出流
 62                     out = new FileOutputStream(currentFileSavePath + "\\" + fileName);
 63                     int len = 0;
 64                     byte[] buffer = new byte[1024];
 65                     while((len=in.read(buffer)) > 0) {
 66                         out.write(buffer, 0, len);
 67                     }
 68                 }
 69             }
 70         } catch (Exception e) {
 71             e.printStackTrace();
 72         } finally {
 73             if (in != null) {
 74                 in.close();
 75             }
 76             if (out != null) {
 77                 out.close();
 78             }
 79         }
 80
 81     }
 82     public String makeFileName(String fileName) {
 83         return UUID.randomUUID().toString() + "_" + fileName;
 84     }
 85     public String makePath(String savePath, String fileName) {
 86         // 根据文件名产生int型hashcode, 32位二进制
 87         int hashcode = fileName.hashCode();
 88         // 获取第4位 0-15
 89         int dir1 = hashcode&0xf;
 90         // 获取第5-8位 0-15
 91         int dir2 = (hashcode&0xf0)>>4;
 92         // 凭借随机目录
 93         String dir = savePath + "\\" + dir1 + "\\" + dir2;  // upload\2\4
 94         // 若目录不存在时, 创建目录
 95         File file = new File(dir);
 96         if(!file.exists()) {
 97             file.mkdirs();
 98         }
 99         return dir;
100     }
101
102     @Override
103     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
104         doGet(req, resp);
105     }
106 }

2. 编写获取所有下载文件名称Servlet

 1 /**
 2  * Created by IntelliJ IDEA.
 3  *
 4  * @Auther: ShaoHsiung
 5  * @Date: 2018/8/26 16:26
 6  * @Title:
 7  * @Description: 列出网站所有下载文件
 8  */
 9 public class ListFileServlet extends HttpServlet {
10     @Override
11     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
12
13         // 获取下载目录路径
14         String filePath = this.getServletContext().getRealPath("/WEB-INF/upload");
15         // 创建存储文件下载路径的Map集合
16         Map filePathMap = new HashMap();
17         // 将下载目录中所有文件名称存储到Map集合中
18         listFile(new File(filePath), filePathMap);
19         // 存储数据后跳转
20         request.setAttribute("map", filePathMap);
21         request.getRequestDispatcher("/listfile.jsp").forward(request, response);
22     }
23
24     /**
25      * 将下载目录中所有文件名称存储到Map集合中
26      * @param file 下载目录
27      * @param filePathMap Map集合
28      */
29     private void listFile(File file, Map filePathMap) {
30         if(!file.isFile()) {
31             // 文件为目录时
32             File[] files = file.listFiles();
33             for (File f : files) {
34                 // 递归调用
35                 listFile(f, filePathMap);
36             }
37         } else {
38             // 9349249849-88343-8344_阿_凡_达.avi 处理结果为: 阿_凡_达.avi
39             String realName = file.getName().substring(file.getName().indexOf("_")+1);
40             // 9349249849-88343-8344_阿_凡_达.avi -> 阿_凡_达.avi
41             filePathMap.put(file.getName(), realName);
42         }
43     }
44
45     @Override
46     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
47         doGet(req, resp);
48     }
49 }

3. 处理文件下载请求Servlet

 1 public class FileDownload extends HttpServlet {
 2     @Override
 3     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 4
 5         // 获取下载文件名称的key
 6         String filename = request.getParameter("filename");  //23239283-92489-dfsd_阿凡达.avi
 7         // 解决get请求的中文乱码问题
 8         filename = new String(filename.getBytes("iso8859-1"),"UTF-8");
 9         // 获取下载目录
10         String path = makePath(filename,this.getServletContext().getRealPath("/WEB-INF/upload"));
11         // 获取下载文件
12         File file = new File(path + "\\" + filename);
13         // 下载文件不存在时
14         if(!file.exists()){
15             request.setAttribute("message", "您要下载的资源已被删除!!");
16             request.getRequestDispatcher("/message.jsp").forward(request, response);
17             return;
18         }
19         // 获取下载文件名称 阿凡达.avi
20         String realname = filename.substring(filename.indexOf("_") + 1);
21         // 通知浏览器以下载方式打开, 不同浏览器可能不同
22         response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));
23         // 下载文件
24         FileInputStream in = new FileInputStream(path + "\\" + filename);
25         OutputStream out = response.getOutputStream();
26         byte buffer[] = new byte[1024];
27         int len = 0;
28         while((len=in.read(buffer))>0){
29             out.write(buffer, 0, len);
30         }
31         in.close();
32         out.close();
33
34     }
35
36     /**
37      * 根据文件名称产生随机目录并将下载路径与随机目录拼接
38      * @param filename 文件名称
39      * @param savePath 下载路径
40      * @return 下载路径与随机目录拼接结果
41      */
42     private String makePath(String filename,String savePath){
43
44         int hashcode = filename.hashCode();
45         int dir1 = hashcode&0xf;  //0--15
46         int dir2 = (hashcode&0xf0)>>4;  //0-15
47
48         String dir = savePath + "\\" + dir1 + "\\" + dir2;  //upload\2\3  upload\3\5
49         File file = new File(dir);
50         if(!file.exists()){
51             file.mkdirs();
52         }
53         return dir;
54     }
55
56     @Override
57     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
58         doGet(req, resp);
59     }
60 }

4. 配置web.xml

 1 <!-- 文件上传 -->
 2 <servlet>
 3     <servlet-name>FileUpload1</servlet-name>
 4     <servlet-class>fileupload.FileUpload1</servlet-class>
 5 </servlet>
 6 <servlet-mapping>
 7     <servlet-name>FileUpload1</servlet-name>
 8     <url-pattern>/servlet/FileUpload1</url-pattern>
 9 </servlet-mapping>
10
11 <!--文件下载-->
12 <servlet>
13     <servlet-name>ListFileServlet</servlet-name>
14     <servlet-class>fileupload.ListFileServlet</servlet-class>
15 </servlet>
16 <servlet-mapping>
17     <servlet-name>ListFileServlet</servlet-name>
18     <url-pattern>/servlet/ListFileServlet</url-pattern>
19 </servlet-mapping>
20 <servlet>
21     <servlet-name>FileDownload</servlet-name>
22     <servlet-class>fileupload.FileDownload</servlet-class>
23 </servlet>
24 <servlet-mapping>
25     <servlet-name>FileDownload</servlet-name>
26     <url-pattern>/servlet/FileDownload</url-pattern>
27 </servlet-mapping>

5. 编写获取文件名称JSP

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 3
 4 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 5 <html>
 6   <head>
 7     <title>My JSP ‘listfile.jsp‘ starting page</title>
 8   </head>
 9
10   <body>
11
12     <c:forEach var="me" items="${map}">
13         <c:url value="/servlet/FileDownload" var="downurl">
14             <c:param name="filename" value="${me.key}"></c:param>
15         </c:url>
16         ${me.value }  <a href="${downurl}">下载</a>  <br/>
17     </c:forEach>
18
19   </body>
20 </html>

6. 编写文件上传JSP

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3 <head>
 4     <title>演示文件上传</title>
 5 </head>
 6 <body>
 7     <form action="${pageContext.request.contextPath}/servlet/FileUpload1" method="post" enctype="multipart/form-data">
 8         用户名: <input type="text" name="username"/><br/>
 9         文件1: <input type="file" name="file1"/><br/>
10         文件2: <input type="file" name="file1"/><br/>
11         <input type="submit"/>
12     </form>
13 </body>
14 </html>

7. 效果演示

在浏览器中访问http://localhost:8080/servlet/ListFileServlet

原文地址:https://www.cnblogs.com/shaohsiung/p/9537835.html

时间: 2024-08-29 04:09:29

JavaWeb实现文件下载的相关文章

javaWeb之文件下载

//本次的文件下载是接着上次文件上传的 //为方便实现文件下载,可借助第三方开源jar包:commons.io: //因为下载时候与浏览器类型有一定关系,可能会出现一些小偏差 //客户端代码:<a href="<c:url value='/DownloadServlet'/>">点击下载</a> //以下为服务端代码: package cn.hl.download; import java.io.FileInputStream;import java

javaweb 的文件下载

前台代码 1 //模板下载 2 templatesDownload : function(){ 3 var form = $("<form>"); //定义一个form表单 4 form.attr('style', 'display:none'); //在form表单中添加查询参数 5 form.attr('target', ''); 6 form.attr('method', 'post'); 7 form.attr('action', getPath() + '/Exp

javaweb文件下载 部署到服务器文件下载有问题

最近做了一个网站,有关检索的一个系统,里边涉及到了文件的下载和查看(pdf文件),遇到了一些问题,现在和大家分享一下我解决的办法: 文件下载总的来说有两种方式(我认为的啊,别当真), 一种是通过超链接的方式:<a href="<%=basePath%>/download/文件名称">下载</a>   这种方式就可以下载根路径下的download下的文件了, 但是这种下载只能下载 .rar文件,当下载pdf或者图片的时候,他就不打开那个文件,所以这种方

JavaWeb项目实现文件下载

File file = new File(path);// path是根据日志路径和文件名拼接出来的 String filename = file.getName();// 获取日志文件名称 InputStream fis = new BufferedInputStream(new FileInputStream(path)); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); response.r

JavaWeb学习总结(五十)——文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

深入分析JavaWeb Item40 -- 文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

Javaweb学习笔记10—文件上传与下载

 今天来讲javaweb的第10阶段学习.文件的上传与下载,今天主要说的是这个功能的实现,不用说了,听名字就是外行人也知道肯定很重要啦. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的思维导图感兴趣并且想看到你们跟详细的备注信息,请点击下载 另外:如果图看不清的话请右击---在新窗口中打开会清楚很多 一*, 文件的上传:      1 *分析实现步骤: 1.1* 客户端浏览器通过文件域选择本地要上传的文件. * 点击"上传"按钮

javaweb笔记全套

Lesson 1 一.eclipse工具的使用 1. java代码的位置 1) 选择工作空间 workspace  选择一个文件夹存放程序(代码) 不要用中文和空格 2) 新建一个java 工程(Project) 3) 建包 建类 2. 快捷键 alt + / : 代码自动补齐,需要配置的 打开preferences(首选项), 搜keys,打开快捷键配置面板 搜 alt+/ ,取消绑定 搜 content assist ,取消原先的绑定,配置成alt+/ ctrl+1: 错误自动修复, 注意,

【JavaWeb】参考大神重新写的上传下载

自学java,选择从简单的javaweb入手了. 读了网上某位大神的细致文章,了解后自己写了这篇上传下载的,加上了自己一部分的理解注释. 算是入门篇吧.大致完成了任务,比较粗糙. fileHanderServlet.java (文件上传处理) 1 package up.file.Servletfile; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 i