D10 Sping Boot 入门 Sping框架--Java Web之文件操作--上传和下载

文件上传

  1、文件的上传

    Ⅰ、要有一个form标签,method=post请求。

    Ⅱ、form标签的encType属性值必须是multipart/form-data值。

    Ⅲ、在form标签使用input type=file添加上传的文件。

    Ⅳ、编写服务器代码(Servlet程序)接收,处理上传的数据。

    

    encType=multipart/form-data表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器。

     新建upload.jsp

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3 <head>
 4     <title>upload</title>
 5 </head>
 6 <body>
 7     <form action="http://localhost:8080/EL_JSTL/uploadServlet" method="post" enctype="multipart/form-data">
 8         用户名:<input type="text" name="username" id="username"><br />
 9         头像:<input type="file" name="photo" id="photo"><br />
10         <input type="submit" value="上传">
11     </form>
12 </body>
13 </html>

    新建UploadServlet程序(并在web.xml中配置Servlet程序)

    
 1 package com.gychen.servlet;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.ServletInputStream;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import java.io.IOException;
 9 
10 public class UploadServlet extends HttpServlet {
11 
12     /**
13      * 处理文件上传的数据
14      * @param req
15      * @param resp
16      * @throws ServletException
17      * @throws IOException
18      */
19     @Override
20     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
21 
22         System.out.println("文件已上传");
23         ServletInputStream inputStream = req.getInputStream();
24         byte[] buffer = new byte[1024000];
25         int read = inputStream.read(buffer);
26         System.out.println(new String(buffer,0,read));
27     }
28 }
UploadServlet

    

  2、服务器解析上传文件

    Ⅰ、导入两个jar包

     

     Ⅱ、两个jar包中的常用类

    ServletFileUpload类,用于解析上传的数据。

    FileItem类,表示每一个表单项。

    

     

   3、fileupload类库的使用

    
 1 package com.gychen.servlet;
 2 
 3 import org.apache.commons.fileupload.FileItem;
 4 import org.apache.commons.fileupload.FileItemFactory;
 5 import org.apache.commons.fileupload.FileUploadException;
 6 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 7 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 8 
 9 import javax.servlet.ServletException;
10 import javax.servlet.ServletInputStream;
11 import javax.servlet.http.HttpServlet;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14 import java.io.File;
15 import java.io.IOException;
16 import java.util.List;
17 
18 public class UploadServlet extends HttpServlet {
19 
20     /**
21      * 处理文件上传的数据
22      * @param req
23      * @param resp
24      * @throws ServletException
25      * @throws IOException
26      */
27     @Override
28     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
29 
30 
31         //判断上传的数据是否为多段数据(只有是多段数据才是文件上传的)
32         if(ServletFileUpload.isMultipartContent(req)){
33             //创建FileItemFactory工厂实现类
34             FileItemFactory fileItemFactory = new DiskFileItemFactory();
35             //创建用于解析上传数据的工具类ServletFileUpload
36             ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
37             //解析上传的数据,得到每一个表单项FileItem
38             try {
39                 List<FileItem> list = servletFileUpload.parseRequest(req);
40                 //循环判断每一个表单项是普通类型还是上传的文件
41                 for(FileItem fileItem : list){
42                     if(fileItem.isFormField()){
43                         //普通表单项
44                         System.out.println("表单项的name属性值:"+fileItem.getFieldName());
45                         //参数utf-8,解决乱码问题
46                         System.out.println("表单项的value值:"+fileItem.getString("utf-8"));
47                     }else{
48                         //上传的文件
49                         System.out.println("文件的name属性值:"+fileItem.getFieldName());
50                         System.out.println("文件的文件名:"+fileItem.getName());
51                         //把文件写入磁盘
52                         fileItem.write(new File("D:\\MyStudy\\" +
53                                 "SpringBootStudy\\JavaWebStudy\\EL&JSTL\\" +
54                                 "web\\file\\upload\\"+fileItem.getName()));
55                     }
56                 }
57             } catch (Exception e) {
58                 e.printStackTrace();
59             }
60         }
61     }
UploadServlet

 

文件下载

    

  新建DownloadServlet继承HtttpServlet(并配置web.xml)

   
 1 package com.gychen.servlet;
 2 
 3 import org.apache.commons.io.IOUtils;
 4 import sun.misc.BASE64Encoder;
 5 
 6 import javax.servlet.ServletContext;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 import java.io.IOException;
12 import java.io.InputStream;
13 import java.io.OutputStream;
14 import java.net.URLEncoder;
15 import java.util.Base64;
16 
17 public class DownloadServlet extends HttpServlet {
18     @Override
19     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
20 
21         //1、获取要下载的文件名
22         String downloadFileName = "1.gif";
23 
24         //2、读取要下载的文件内容(通过ServletContext对象可以读取)
25         ServletContext servletContext = getServletContext();
26 
27         //获取要下载的文件类型
28         String mimeType = servletContext.getMimeType("/file/"+downloadFileName);
29 //        System.out.println("下载的文件类型:"+mimeType);
30 
31         //在回传前,通过响应头告诉客户端返回的数据类型
32         resp.setContentType(mimeType);
33 
34         /*
35         还要告诉客户端收到的数据是用于下载使用(使用响应头)
36         Content-Disposition表示收到的数据怎么处理
37         attachment表示附件,filename表示下载时命名的文件名(允许与源文件名不同)
38         filename命名有中文时必须对文件名进行URL编码,其中火狐浏览器不支持URL编码,支持Base64编码
39         */
40 
41         if(req.getHeader("User-Agent").contains("Firefox")){
42             //如果是火狐浏览器,使用BASE64编码
43             resp.setHeader("Content-Disposition","attachment;filename==?UTF-8?B?"
44                     + new BASE64Encoder().encode("你好.gif".getBytes("UTF-8"))+"?=");
45         }else{
46             //如果是其他浏览器,使用URL编码
47             resp.setHeader("Content-Disposition","attachment;filename="
48                     + URLEncoder.encode("你好.gif","UTF-8"));
49         }
50 
51 
52         /**
53          * /斜杆被服务器解析表示地址为http://ip:port/工程名/ 映射到代码web目录
54          */
55         //这里发不能有二级文件夹(即不能"/file/download/"),暂没深究。
56         InputStream resourceAsStream = servletContext.getResourceAsStream("/file/"+downloadFileName);
57 
58         //获取响应的输出流
59         OutputStream outputStream = resp.getOutputStream();
60 
61 //        //3、把下载的文件内容回传给客户端
62 //        //读取输入流中全部的数据,复制给输出流,输出给客户端
63         IOUtils.copy(resourceAsStream,outputStream);
64     }
65 }
DownloadServlet

 

posted @ 2020-04-02 16:47  nuister  阅读(265)  评论(0编辑  收藏  举报