如何在Spring Boot中上传下载文件

laojean
发布于 2020-9-3 18:12
浏览
0收藏

在日常开发工作中,基本上每个项目都会有各种文件上载和下载。 大多数文件是excel文件。 我使用apache POI操作的excel Java API。 稍后我将专门研究POI。  这次我们将不讨论如何操作文件,而仅讨论如何上载和下载文件。

1. 文件的上传
在现在的JavaWeb项目中,与前端进行交互的基本都是SpringMVC框架。Spring专门提供了一个接口MultipartFile,这个接口帮我们简化了从页面到服务端的文件操作,以前我们只能从request里面拿,现在有了这个接口,我们操作起来就会很简单。话不多说,直接上代码。

我们只是模拟文件上传的操作,所以我们从页面上传文件,然后存到电脑桌面。

@RequestMapping("/upload")
    public void upload(MultipartFile file) throws IOException {
        init(file, 1);
    }

    @RequestMapping("/uploads")
    public void uploads(MultipartFile[] files, DTO dto) throws IOException {
        for (int i = 0; i < files.length; i++) {
            init(files[i], i);
        }
        System.out.println(dto.getParam());
    }

	/**
     * 下载文件初始化
     * @param file 文件
     * @param i 为了区别文件,防止被覆盖
     * @throws IOException
     */
    private void init(MultipartFile file, int i) throws IOException {
        String filename = file.getOriginalFilename();
        OutputStream os = new FileOutputStream(new File("C:\\Users\\WJF\\Desktop" + File.separator + i + filename));
        InputStream is = file.getInputStream();
        StreamUtils.copy(is, os);
        is.close();
        os.close();
    }

上面的代码中,不管是单个文件还是多文件都是很简单的,还可以带其他参数DTO。

2. 文件的下载
文件的下载也是很简单的,但是Response头如果没有设置好,就可能下载失败,下载下来也可能是乱码的。但是这些头设置其实很简单,但是每次下载文件的时候都要这么设置一下,其实是很繁琐的,所以在这里我使用了已经封装好的下载API,直接上代码。

首先我们引入jar包:

<!--springboot父工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <!--springboot框架web组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--wjf-download下载小框架,用来简化下载的无味繁琐的操作-->
        <dependency>
            <groupId>red.wjf</groupId>
            <artifactId>wjf-download</artifactId>
            <version>0.1.0.RELEASE</version>
        </dependency>
    </dependencies>

在这里我引入了一个下载的jar包,这个包可以在maven中央仓库直接找到的。这个下载文件jar包的官网地址:传送门

在下载文件之前我们需要配置一下,创建一个下载器,将下载器交给Spring管理:

DownloadConfig.java:

package com.butterflytri.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import red.wjf.download.downloader.ImageDownloader;
import red.wjf.download.downloader.WebDownloader;

/**
 * @author: WJF
 * @date: 2020/7/29
 * @description:  DownloadConfig
 */

@Configuration
public class DownloadConfig {

    @Bean
    public WebDownloader webDownloader() {
        return new WebDownloader();
    }

    @Bean
    public ImageDownloader imageDownloader() {
        return new ImageDownloader();
    }

}

在这里我们创建了两个下载器,都交给了Spring框架管理。

@RequestMapping("/downloadTest")
    public void downloadTest(HttpServletRequest request, HttpServletResponse response, String fileName) {
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("test.docx");
        try {
            DataWriter writer = new DataWriter(is);
            webDownloader.defaultDownload(request, response, fileName, writer);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @RequestMapping("/downloadImg")
    public void downloadImg(HttpServletRequest request, HttpServletResponse response) {
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("img.jpg");
        ImageWriter writer = new ImageWriter(is, ImgSuffix.JPG);
        imageDownloader.defaultDownload(request, response, writer);
    }

这两个文件(test.docx和img.jpg)都在类路径下,从浏览器页面调用方法,就会下载,不会乱码也不会下载失败,除非文件不存在。jar包还提供了图片的Base64格式下载。在国内我们只需要调用这个默认的下载方法就可以了。下载的演示我就不演示了,大家可以拉下我的代码看看,觉得我写的东西对你有用,也可以给我点个赞哦。

 

 

分类
标签
已于2020-9-3 18:12:46修改
收藏
回复
举报
回复
    相关推荐