2021年7月27日

文件上传和下载

Author:Exchanges

Version:9.0.2

一、引言


1.1 场景

  • 在项目中,文件的上传和下载是常见的功能。很多程序或者软件中都经常使用到文件的上传和下载。

  • 邮箱中有附件的上传和下载

  • OA办公系统中有附件材料的上传

二、 文件上传


2.1 概念

当用户在前端页面点击文件上传后,用户上传的文件数据提交给服务器端,实现保存。

2.2 文件上传实现步骤

2.2.1引入jar包

jsp-api.jar

servlet-api.jar

2.2.2 提交数据格式
  • 提供form表单,method必须是post。因为post请求无数据限制。

  • 表单的enctype属性值必须为multipart/form-data。

<form enctype="multipart/form-data" method="post"></form>
2.2.3 编写上传的Html页面
  • 提供file表单组件,提供给用户上传文件的Html页面

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
</head>
<body>

<form action="uploadServlet" method="post" enctype="multipart/form-data">

  userName:<input type="text" name="username"><br><br>
  upload:<input type="file" name="file"><br><br>

   <input type="submit" value="提交">

</form>

</body>
</html>
2.2.4编写上传的Servlet

在 Servlet 3.0 及其以上版本的容器中进行服务器端文件上传的编程,是围绕着注解类型 MultipartConfig 和 javax. servlet.http.Part 接口进行的。处理已上传文件的 Servlet 必须以@MultipartConfig 进行注解。

package com.qf.servlet;

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

@WebServlet("/uploadServlet")
//该注解主要是为了辅助 Servlet 3.0 中 HttpServletRequest 提供的对上传文件的支持
@MultipartConfig
public class UploadServlet extends HttpServlet {

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //设置字符集
       req.setCharacterEncoding("UTF-8");
       resp.setContentType("text/html;charset=utf-8");
       //通过getPart方法获取文件组件
       Part uploadFile = req.getPart("file");//对应<input type="file" name="file">中name属性的属性值
       System.out.println(uploadFile.getSubmittedFileName());//上传文件名
       //设置上传的路径
       String uploadPath = "D:\\tomcat-server\\apache-tomcat-8.5.31\\webapps\\upload";
       //创建上传文件夹对象
       File file = new File(uploadPath);
       //如果文件夹不存在,新建
       if(!file.exists()){
           file.mkdirs();
      }
       //如果上传的文件名相同,文件会被覆盖,可以使用UUID设置文件名前缀
       String uuid = UUID.randomUUID().toString().replace("-","");
       //拼接上传文件名
       String uploadFileName = uuid + uploadFile.getSubmittedFileName();
       //如果上传的文件不是空,进行保存
       if(uploadFile!=null){
           uploadFile.write(uploadPath+"/"+uploadFileName);
      }
       resp.getWriter().write("上传成功!"+uploadFile.getSubmittedFileName());
  }
}

2.3 @MultipartConfig详解

属性名类型是否可选描述
fileSizeThreshold int 当数据量大于该值时,内容将被写入文件。
location String 存放生成的文件地址。
maxFileSize long 允许上传的文件最大值。默认值为 -1,表示没有限制。
maxRequestSize long 针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。

通过request.getPart(String name)方法获取文件组件,通过uploadfile.getSubmittedFileName()获取上传文件

三、 文件下载


3.1 概念

我们可以将一些文件资源提供给用户进行下载

3.2 下载

package com.qf.servlet;

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.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

@WebServlet("/downServlet")
public class DownServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //设置请求以及响应的字符集
       req.setCharacterEncoding("utf-8");
       resp.setContentType("text/html;charset=utf-8");

       //下载服务器上的资源(服务器可能是本地的,可能是外部的)
       //指定下载图片的路径
       //String filePath = "http://localhost:8083/upload/72f83feccb0648109bf8051be91a5fb12.jpg";
       String filePath = "http://imgessl.kugou.com/commendpic/20210817/20210817104150299961.jpg";
       //建立网络连接
       URL url = new URL(filePath);
       URLConnection urlConnection = url.openConnection();
       //获取输入流对象
       InputStream inputStream = urlConnection.getInputStream();
       //创建File对象,用于接收服务器上的图片
       File file = new File("myImg.jpg");
       //以下载的方式打开文件
       resp.setHeader("Content-Disposition","attachment;filename="+file.getName());
       //获取输出流
       ServletOutputStream outputStream = resp.getOutputStream();
       //创建字节数组
       byte[] bytes = new byte[1024];
       int read = inputStream.read(bytes);
       //复制粘贴的过程
       while (read!=-1){
           outputStream.write(bytes);
           read = inputStream.read(bytes);
      }

       outputStream.close();
       inputStream.close();
  }

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doGet(req,resp);
  }
}



posted @ 2021-09-27 21:18  张三疯321  阅读(74)  评论(0)    收藏  举报