Spring Boot 教程 – 文件上傳下載

在日常的開發工作中,基本上每個項目都會有各種文件的上傳和下載,大多數文件都是excel文件,操作excel的JavaAPI我用的是apache的POI進行操作的,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 download01(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格式下載。在中國我們只需要調用這個默認的下載方法就可以了。下載的演示我就不演示了,大家可以拉下我的程式碼看看,覺得我寫的東西對你有用,也可以給我點個贊哦。

3. 項目地址

本項目傳送門:

此教程會一直更新下去,覺得部落客寫的可以的話,關注一下,也可以更方便下次來學習。