• 【springMVC】文件上传和下载


    一、文件下载

    使用ResponseEntity实现文件下载的功能

    1、在controller包下新建FileUpAndDownController类

    //实现下载功能
    @RequestMapping("/testDown")
    //该方法返回值为ResponseEntity<byte[]>
    public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {
        //获取ServlContext对象
        ServletContext servletContext = session.getServletContext();
        //获取服务器中文件的真实路径
        String realPath = servletContext.getRealPath("/static/img/1.jpg");
        //创建输入流。下载文件需要先读取文件,然后再写入文件,完成一个复制过程,因此需要创建输入流
        InputStream is = new FileInputStream(realPath);
        //创建字节数组。is.available()用来获取输入流is对应文件的所有字节数
        byte[] bytes = new byte[is.available()];
        //将输入流is对应文件的所有字节都读到字节数组bytes中
        is.read(bytes);
        //创建HttpHeaders对象设置响应头信息
        MultiValueMap<String, String> headers = new HttpHeaders();
        //设置要下载方式以及下载文件的名字
        //headers.add("")中只有1.jpg可以更改,其它的都不能改,因为其它部分是用来设置下载方式的
        headers.add("Content-Disposition", "attachment;filename=1.jpg");
        //设置相应状态码。OK的状态码为200
        HttpStatus statusCode = HttpStatus.OK;
        //创建ResponseEntity对象,用来响应浏览器
        //bytes为响应体;headers为响应头,是Map集合;statusCode为响应状态码
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<byte[]>(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

    2、在static目录下新建img目录,并放入图片1.jpg

    3、在templates目录下新建file.html文件

    <!--下载文件-->
    <a th:href="@{/testDown}">下载1.jpg</a><br>
    
    • 1
    • 2

    4、在resources根目录的springMVC.xml主配置文件中,编写主页面的标签

    <mvc:view-controller path="/file" view-name="file" />
    
    • 1

    二、文件上传

    1、添加fileupload依赖(SpringMVC中上传文件必须要有此依赖,但是下载不需要)

    <!--fileupload依赖-->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、在resources根目录的springMVC.xml主配置文件中添加配置(配置文件上传解析器)

    <!--配置文件上传解析器,将上传的文件封装为MultipartFile对象。
        此处的id必须为multipartResolver,否则上传会报错。
    -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
    
    • 1
    • 2
    • 3
    • 4

    3、file.html中的设置

    <!--上传文件,上传必须使用post-->
    <form th:action="@{/testUp}" method="post" enctype="multipart/form-data">
        头像:<input type="file" name="photo"><br>
        <input type="submit" value="上传"><br>
    </form>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4、FileUpAndDownController类中的设置

    //实现上传功能
    @RequestMapping("/testUp")
    /**
    * MultipartFile photo表示为将上传的photo文件封装到MultipartFile对象中
    *
    * 由于无法之间将photo封装为MultipartFile对象,因此还需要在springMVC.xml
    * 中配置文件上传解析器
    *
    * HttpSession session用来获取服务器路径
    */
    public String testUp(MultipartFile photo, HttpSession session) throws IOException {
        //获取上传文件的文件名
        String fileName = photo.getOriginalFilename();
        //获取上传文件的后缀名
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        //将UUID作为文件名
        String uuid = UUID.randomUUID().toString();
        //将uuid和后缀名拼接后的结果作为最终的文件名
        fileName = uuid + suffixName;
        //获取ServlContext对象,然后通过servletContext获取服务器中photo目录的路径
        ServletContext servletContext = session.getServletContext();
        //获取服务器中photo目录的真实路径
        String photoPath = servletContext.getRealPath("photo");
        File file = new File(photoPath);
        //判断photoPath所对应路径是否存在
        if (!file.exists()){
            //若不存在,则创建目录
            file.mkdir();
        }
        //File.separator表示文件分隔符
        //将“photo目录路径+文件分隔符+上传文件的名称”组合为最终的上传路径
        String finalPath = photoPath + File.separator + fileName;
        //文件上传
        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
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    网络系统管理 - Windows Server AD域安全策略
    药物滥用第五篇介绍
    这12款idea插件,能让你代码飞起来
    数据挖掘知识随笔
    Yarn的Tool接口案例
    【Java集合类面试十八】、ConcurrentHashMap是怎么分段分组的?
    第十七章 类和对象——继承
    对北京新发地当时菜品三十天内价格分布式爬取(1)---(获取当时菜品数据并构建请求数据推入redis)
    【Linux】linux nfs共享存储服务
    Spring Cloud系列(二):Eureka Server应用
  • 原文地址:https://blog.csdn.net/chairongdian/article/details/125615322