1. 程式人生 > 實用技巧 >Spring Boot 教程 - 檔案上傳下載

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. 專案地址

本專案傳送門:

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