运用servlet来实现文件的上传与下载

Posted dabu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运用servlet来实现文件的上传与下载相关的知识,希望对你有一定的参考价值。

文件的上传:

 1 /**
 2  * 1. 文件的上传必须使用post请求,因为get请求的数据是在 url地址上, 但是url地址
 3  *   能够携带数据大小是有限:2k 4k
 4  * 2. 文件上传必须的指定 @MultipartConfig, 意思说使用该Servlet来处理 多媒体的表单数据。
 5  */
 6 @WebServlet(value = "/file",name = "FileServlet")
 7 @MultipartConfig//文件上传必须指定他  告诉这个类是指定我们表单是一个多媒体表单数据
 8 public class FileServlet extends HttpServlet {
 9 
10     //文件存储的路径
11     private  String fileLocation="F:/nginx/nginx-1.17.2/html/";
12     private String fileServer = "http://localhost/";
13     @Override
14     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
15         req.setCharacterEncoding("utf-8");
16         Part part=req.getPart("avatar");//获取上传文件的所有信息,是对将要上传的一个文件进行封装
17 
18         //获取文件名
19         //part.getName();//这个不是文件名
20         //文件名是在Part的头部, "content-disposition"中存储有文件名
21         String contentDisposition=part.getHeader("content-disposition");
22 
23         //  "转义
24         String filePrefix="filename="";
25 
26         //获取文件名开始位置所在的索引
27         int index = contentDisposition.indexOf(filePrefix) + filePrefix.length();
28 
29 
30         //获取文件名, contentDisposition.length() - 1 原因是因为最后有个 "
31         String fileName = contentDisposition.substring(index, contentDisposition.length() - 1);
32         //System.out.println(fileName);
33 
34         //获取文件的后缀名 .png .txt
35         String fileSuffix=fileName.substring(fileName.indexOf("."));
36 
37         //随机生成一个字符串
38         String newFilename= UUID.randomUUID().toString()+fileSuffix;
39 
40         InputStream is = part.getInputStream();   //获取文件的输入流
41         //System.out.println(contentDisposition);
42 
43         //文件输出流
44         OutputStream os=new FileOutputStream(new File(fileLocation+newFilename));
45         //OutputStream os=new FileOutputStream(fileLocation+newFilename);
46 
47 
48         //存储IO流没次读取的数据
49         byte[] bs=new byte[1024];
50         int length=0;//没次读取的长度
51 
52 
53         while ((length=is.read(bs))!=-1){
54             os.write(bs,0,length);
55         }
56         os.flush();
57         os.close();
58         is.close();
59 
60         resp.setContentType("text/html;charset=utf-8");
61         PrintWriter writer = resp.getWriter();
62 
63         StringBuffer html = new StringBuffer();
64         html.append("<html>")
65                 .append("<head></head>")
66                 .append("<body><h1>上传成功</h1>")
67                 // fileServer + newFileName = http://localhost/0dc725b1-5b12-4865-bbd0-2fbed66b9e7e.png
68                 .append("<img src="" + fileServer + newFilename + "">")
69                 .append("<video src="" + fileServer + newFilename + "" width="600" height="400" autoplay>")
70                 .append("</body></html>");
71 
72 //        String html = "<html><head></head><body><h1>注册成功</h1><p>" + user.getInterests() + "</p></body></html>";
73 
74         writer.write(html.toString());
75         writer.flush();
76         writer.close();
77 
78     }
79 }

文件的表单数据:

 1 <body>
 2 
 3     <!--<video src="http://localhost/33.mp4" width="600" height="400"/>-->
 4 
 5     <!--
 6     1 文件的上传必须是post,因为post请求的数据是放在请求体里面
 7     可以携带大量的数据
 8     2 enctype必须是多媒体表单数据 文件的上传必须要这个参数
 9     -->
10     <form method="post"  enctype="multipart/form-data" action="file">
11         File:<input type="file" name="avatar"><br>
12         <input type="submit">
13     </form>
14 </body>

技术图片

 

 

 

 

文件的下载:

 1 @WebServlet(value = "/dowload",name = "DownLoadServlet")
 2 public class DownLoadServlet extends HttpServlet {
 3 
 4     //资源地址
 5     private  String resourceLocation="F:/nginx/nginx-1.17.2/html/";
 6     //下载是一个get请求
 7     @Override
 8     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 9 
10 //        //文件输入流
11 //        InputStream is=new FileInputStream(resourceLocation);
12 //        String fileName="44.mp4";//文件名
13 //
14 //        byte[] bs=new byte[2048];
15 //        int length=0;
16 //
17 //        //处理中文文件下载的时候浏览器显示乱码的问题
18 //        String cnFileName= URLEncoder.encode(fileName,"utf-8");
19 //
20 //        //下载的时候要指定头信息 是一个固定的方式
21 //        resp.setHeader("content-disposition","attachment;filename="+cnFileName);
22 //
23 //        ServletOutputStream servletOutputStream=resp.getOutputStream();
24 //
25 //        while ((length=is.read(bs))!=-1){
26 //            servletOutputStream.write(bs,0,length);
27 //        }
28 //        servletOutputStream.flush();
29 //        servletOutputStream.close();
30 //        is.close();
31 
32         String name=req.getParameter("name");
33         //文件输入流
34         InputStream is=new FileInputStream(resourceLocation+name);
35         // String fileName="44.mp4";//文件名
36 
37         byte[] bs=new byte[2048];
38         int length=0;
39 
40         //处理中文文件下载的时候浏览器显示乱码的问题
41         String cnFileName= URLEncoder.encode(name,"utf-8");
42 
43         //下载的时候要指定头信息 是一个固定的方式
44         resp.setHeader("content-disposition","attachment;filename="+cnFileName);
45 
46         ServletOutputStream servletOutputStream=resp.getOutputStream();
47 
48         while ((length=is.read(bs))!=-1){
49             servletOutputStream.write(bs,0,length);
50         }
51         servletOutputStream.flush();
52         servletOutputStream.close();
53         is.close();
54 
55     }
56 }

文件下载的表单:

1 <body>
2     <a href="dowload?name=2.png">2.png下载</a><br>
3     <a href="dowload?name=11.png">11.png下载</a><br>
4     <a href="dowload?name=33.mp4">33.mp4下载</a><br>
5     <a href="dowload?name=44.mp4">44.mp4下载</a><br>
6 </body>

技术图片

 

 总结:

无论是文件的下载还是上传  当用到servlet时候并且当你的电脑和手机在同一个局域网下面,那么当你在手机浏览器里面输入自己的ip访问地址的时候,你的手机会进行上传和下载同时你的电脑里面也会有相应的数据。

技术图片

 

以上是关于运用servlet来实现文件的上传与下载的主要内容,如果未能解决你的问题,请参考以下文章

servlet实现文件的上传与下载

servlet+jsp实现的文件上传与下载

系统运维系列 之实现servlet上传下载文件(java应用)

使用超链接和后台Servlet实现文件上传和下载(附图和代码)

Spring Boot 2.x 实现文件上传与下载

jsp+servlet怎么实现文件断点上传下载