• SpringMVC实现文件上传和下载功能


    文件下载

    ResponseEntity用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文。具体步骤如下:

    1. 获取下载文件的位置;
    2. 创建流,读取文件;
    3. 设置响应信息,包括响应头,响应体以及响应码;
    4. 返回ResponseEntity对象
    @Controller
    @ResponseBody
    public class UpAndDownController {
    
        @RequestMapping("/test/down")
        public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException{
            /**
             * 1. 获取文件的地址
             */
            // 获取ServletContext对象
            ServletContext servletContext = session.getServletContext();
            // 获取服务器的中文件的真实路径
            String path = servletContext.getRealPath("img");
            System.out.println("path: " + path);  // path: D:\IdeaProject\springmvc_ResponseBody_RequestBody\target\springmvc-1.0-SNAPSHOT\img
            String realPath = path + File.separator + "1.jpg";  // File.separator表示拼接符 “/” 或者“\”,方便拼接不会出错
            System.out.println("realPath: " + realPath);  // realPath: D:\IdeaProject\springmvc_ResponseBody_RequestBody\target\springmvc-1.0-SNAPSHOT\img\1.jpg
    
            /**
             * 2. 创建流,读取文件
             */
            // 创建输入流
            FileInputStream is = new FileInputStream(realPath);
            // 创建字节数组
            byte[] bytes = new byte[is.available()];  // is.available: 返回从此输入流中可以读取(或跳过)的剩余字节数的估计值
            // 将流读到字节数组中
            is.read(bytes);
    
            /**
             * 3. 设置响应信息,包括响应头,响应体以及响应码
             */
            // 创建HttpHeaders对象设置响应头信息
            MultiValueMap<String, String> headers = new HttpHeaders();
            // 设置要下载方式以及下载文件的名字
            headers.add("Content-Disposition", "attachment;filename=1.jpg");
            // 设置响应状态码
            HttpStatus statusCode = HttpStatus.OK;
            // 创建ResResponseEntity对象
            ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);
            // 关闭输入流
            is.close();
            return responseEntity;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    文件上传

     文件上传要求form表单的请求方式必须为post, 并且添加属性enctype=“multipart/form-data”。SpringMVC中上传的文件封装到MultipartFile对象中,通过此对象可以获取文件相关信息。文件上传步骤如下:

    1. 添加依赖
      <dependency>
          <groupId>commons-fileuploadgroupId>
          <artifactId>commons-fileuploadartifactId>
          <version>1.3.1version>
      dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 在SpringMVC的配置文件中添加配置
     
     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">bean>
    
    • 1
    • 2

    前端代码

    DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>indextitle>
    head>
    <body>
    <form th:action="@{/test/up}" method="post" enctype="multipart/form-data">
        头像: <input type="file" name="photo"><br>
        <input type="submit" value="上传文件">
    form>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    后端代码

    @RequestMapping("/test/up")
        public String testUp(MultipartFile photo, HttpSession httpSession) throws IOException{
            /**
             * 1. 获取文件的名称
             */
            // 获取上传文件的名称
            String filename = photo.getOriginalFilename();
            String hzName = filename.substring(filename.lastIndexOf("."));  // 得到后缀名
            System.out.println(hzName);  // .jpg
            System.out.println(UUID.randomUUID());
            filename = UUID.randomUUID().toString() + hzName;
    
            /**
             * 2. 创建文件的存储位置
             */
            // 获取服务器中photo目录的路径
            ServletContext servletContext = httpSession.getServletContext();
            String photoPath = servletContext.getRealPath("photo");
            File file = new File(photoPath);
            if(!file.exists()) file.mkdir();
            String finalPath = photoPath + File.separator + filename;
    
            /**
             * 3. 文件上传
             */
            // 实现上传功能
            photo.transferTo(new File(finalPath));
            return "success";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    关于使用NodeJS+Express搭建服务器访问静态资源的一些填坑经验
    第1章 基于.Net(Core)框架Web程序的IIS部署发布
    win10修改用户名导致问题及解决
    信息录入率百分百上海强化施工现场建筑工人实名制管理
    算法优化,最短路径。
    java计算机毕业设计移动端校园请假系统设计与实现服务器端MyBatis+系统+LW文档+源码+调试部署
    高中数学:平面向量-常考题型汇总
    脚手架开发流程
    Java版人脸跟踪三部曲之二:开发设计
    外部工具/外网无法连接mysql本地数据库
  • 原文地址:https://blog.csdn.net/qq_43751200/article/details/132733574