13.文件的上传下载

2021/6/20 23:26:51

本文主要是介绍13.文件的上传下载,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

13.文件上传下载

一、文件上传

  • 文件上传就是将本地的文件以流的形式上传到远程服务器上
  • 文件上传的表单的要求
    • 1)必须发送POST请求,即form表单的method属性值必须是post
    • 2)form表单的enctype的值必须是multipart/form-data
    • 3)上传文件的表单项的的type属性值为file
  • 在Servlet中获取文件的信息不能按照正常的获取请求参数的方式获取,需要借助于其他工具
  • FileUpload是Apache给我们提供的专门用来进行文件上传和下载的工具,使用它需要导入以下两个jar包
    • commons-fileupload-1.3.1.jar
    • commons-io-2.5.jar
  • 涉及的核心类
    • DiskFileItemFactory
      • 创建工厂对象
    • ServletFileUpload
      • 创建解析器对象
    • FileItem
      • 解析器解析请求之后得到一个FileItem对象
  • 文件下载的代码
package com.atguigu.servlet;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

//处理文件上传的Servlet
@WebServlet(name = "UploadServlet",urlPatterns = "/UploadServlet")
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解决POST请求请求中文乱码问题
        request.setCharacterEncoding("UTF-8");
        //获取用户的描述信息和文件信息
//        String desc = request.getParameter("desc");
//        String file = request.getParameter("file");
//        System.out.println(desc);
//        System.out.println(file);
        //创建工厂对象
        DiskFileItemFactory itemFactory = new DiskFileItemFactory();
        //创建解析器对象
        ServletFileUpload fileUpload = new ServletFileUpload(itemFactory);
        //限制单个文件的大小100KB
        fileUpload.setFileSizeMax(100*1024);
        //限制总文件的大小200KB
        fileUpload.setSizeMax(200*1024);
        try {
            //解析请求
            List<FileItem> fileItems = fileUpload.parseRequest(request);
            /*
                七个核心方法:
                    boolean isFormField():判断是否是普通表单项
                    String getString(String encoding):获取普通表单项中的文本值,调用方法时可以传入字符集
                    String getFieldName():获取name属性值

                    String getName():获取文件名
                    String getContentType():获取文件的类型,是一个MIME值
                    long getSize():获取文件的大小,单位是字节
                    void write(File var1):将文件写到服务器
           */
            //遍历得到每一个表单项
            for (FileItem fileItem : fileItems) {
                //判断是否是普通表单项
                boolean formField = fileItem.isFormField();
                if(formField){
                    //是普通表单项
                    //获取文本框中输入的内容
                    String desc = fileItem.getString("UTF-8");
                    System.out.println("对文件的描述信息是:"+desc);
                    //获取文本框的name属性值
                    String fieldName = fileItem.getFieldName();
                    System.out.println("文本框的name属性值是:"+fieldName);
                }else{
                    //上传文件的表单项
                    //获取文件名
                    String name = fileItem.getName();
                    //获取文件的类型
                    String contentType = fileItem.getContentType();
                    //获取文件的大小
                    long size = fileItem.getSize();
                    System.out.println("文件名是:"+name);
                    System.out.println("文件的类型是:"+contentType);
                    System.out.println("文件的大小是:"+size+"个字节");
                    //将文件写到本地
//                    fileItem.write(new File("E:/"+name));
                    //需求:将文件上传到服务器中项目的upload目录中
                    //获取ServletContext对象
                    ServletContext servletContext = request.getServletContext();
                    //获取upload目录在服务器端的真实路径
                    String realPath = servletContext.getRealPath("/upload");
                    //判断服务器中upload目录是否存在,如果不存在,自动创建它
                    File file = new File(realPath);
                    if(!file.exists()){
                        //创建目录
                        file.mkdirs();
                    }
                    //给上传的每一个文件通过UUID添加一个前缀
                    String prefix = UUID.randomUUID().toString();
                    //将文件上传到upload目录中
                    fileItem.write(new File(realPath+"/"+prefix+"_"+name));
                    //重定向到上传成功的页面
                    response.sendRedirect(request.getContextPath()+"/success.jsp");
                }
            }
        } catch (FileUploadBase.FileSizeLimitExceededException e) {
            //设置一个提示信息并放到request域中
            request.setAttribute("msg","当个文件的大小不能超过100KB");
            //转发到首页
            request.getRequestDispatcher("/index.jsp").forward(request,response);
            e.printStackTrace();
        } catch (FileUploadBase.SizeLimitExceededException e) {
            //设置一个提示信息并放到request域中
            request.setAttribute("msg","总文件的大小不能超过200KB");
            //转发到首页
            request.getRequestDispatcher("/index.jsp").forward(request,response);
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

二、文件下载

  • 文件下载只需要将要下载的文件在服务器端的路径设置到超链接中,点击即可下载,但是如果浏览器支持要下载的文件的格式将不再下载,直接打开
  • 通常我们将要下载的文件放到WEB-INF目录下,然后通过向Servlet发送请求下载
  • 文件下载的代码
package com.atguigu.servlet;

import org.apache.commons.io.IOUtils;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;

//处理文件下载的Servlet
@WebServlet("/DownloadServlet")
public class DownloadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取ServletContext
        ServletContext servletContext = request.getServletContext();
        //设置要下载的文件的名称
        String fileName = "嗨皮.mp4";
        //对中文名使用URLEncoder进行编码
        fileName = URLEncoder.encode(fileName,"UTF-8");
        //获取要下载的资源在服务器端的真实路径
        String realPath = servletContext.getRealPath("/WEB-INF/download/happy.mp4");
        //1.创建一个输入流
        InputStream is = new FileInputStream(realPath);
        //2.设置两个响应头
        //1)设置要下载的文件的MIME类型
        //获取要下载的资源的MIME类型
        String mimeType = servletContext.getMimeType(realPath);
        //方式一:
//        response.setHeader("Content-Type",mimeType);
        //方式二:
        response.setContentType(mimeType);
        //2)设置让浏览器如何处理该资源
        response.setHeader("Content-Disposition","attachment; filename="+fileName);
        //3.获取输出流
        ServletOutputStream os = response.getOutputStream();
        //4.复制流
        IOUtils.copy(is,os);
        //5.关闭流
        is.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}


这篇关于13.文件的上传下载的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程