• 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
  • 相关阅读:
    实现一个基本的静态文件服务的Web服务器
    Http模块
    Java环境
    HelloWorld
    HTTP(s)
    第16条:复合优先于继承
    Tomcat配置https
    第15条:使可变性最小化
    第14条:在公有类中使用访问 方法而非公有域
    第13条:使类和成员的可访问性最小化
  • 原文地址:https://www.cnblogs.com/nuister/p/12620863.html
Copyright © 2020-2023  润新知