1. 程式人生 > 其它 >Spring Boot 學習(一) 檔案上傳

Spring Boot 學習(一) 檔案上傳

注意:

跳轉html檔案一定要放在同一個靜態資原始檔夾下,否則會出現各種報錯

檔案上傳:

首先編寫html的form表單提交,對於form表單的上傳記得新增enctype,對於多檔案上傳,需要在input標籤下新增multiple

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>form</h1>
<
form method="post" action="/world/upload" enctype="multipart/form-data"> 使用者名稱:<input type="text" name="username"><br> 上傳檔案:<input type="file" name="userimg"><br> 多檔案:<input type="file" name="photo" multiple><br> <button type="submit">提交</button> </form
> </body> </html>

其次編寫關於檔案上傳的Controller,跳轉頁面使用Get請求,與此同時表單提交的html在form資料夾下,此時需要新增對於路徑,檔案上傳需要用到post請求,值得注意的是獲取檔案屬性是通過註解@RequestPart來實現,

package com.sp.Controller;


import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; @Slf4j @Controller public class FromSubmit { @GetMapping("/form") public String form_submit() { return "form/formSubmit"; } @PostMapping("/upload") public String upload(@RequestParam("username") String username, @RequestPart("userimg") MultipartFile userimg, //MultipartFile會自動封裝上傳的檔案 @RequestPart("photo") MultipartFile[] photo) { //多檔案上傳儲存在陣列中 log.info("上傳的資訊:username = {}, userimg = {}, photo = {}", username, userimg.getSize(), photo.length); return "index"; //跳轉到index頁面 } }

之後對html上傳的檔案傳輸到本地的磁碟中儲存

通過transferTo方法,以及檔案流裡的方法獲取檔名,檔案大小等方法

@PostMapping("/upload")
    public String upload(@RequestParam("username") String username,
                         @RequestPart("userimg") MultipartFile userimg,         //MultipartFile會自動封裝上傳的檔案
                         @RequestPart("photo") MultipartFile[] photos) throws IOException {
        log.info("上傳的資訊:username = {}, userimg = {}, photo = {}",
                username, userimg.getSize(), photos.length);
        if (!userimg.isEmpty()) {
            //獲取原始的檔名
            String originalFilename = userimg.getOriginalFilename();
            //儲存檔案到指定的本地目錄
            userimg.transferTo(new File("D:\\code\\img\\"+originalFilename));
        }
        if (photos.length > 0) {
            for (MultipartFile photo:photos) {
                if(!photo.isEmpty()) {
                    String originalFilename = photo.getOriginalFilename();   //獲取檔案的原始名字
                    photo.getSize();   //獲取檔案大小
                    photo.transferTo(new File("D:\\code\\img\\"+originalFilename));
                }
            }
        }
        return "index";
    }

執行之後在本地就有了圖片資訊

這裡需要注意的幾個點:

1..如果配置了攔截器,那麼如果需要測試的情況,則在對應的請求上新增不攔截的部分,如果是登陸的話可以不加,在登陸也完成攔截情況的處理

2.關於頁面跳轉的問題,如果對應的html頁面在不同的資料夾下,那麼需要將其放在同一靜態資原始檔夾,否則很容易產生報錯

3.關於檔案上傳,springboot預設配置了最大上傳的大小,此時需要更改上傳檔案大小

4.關於多檔案上傳,需要將其儲存在一個數組中@RequestPart("photo") MultipartFile[] photo

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB

在springboot中有一個MultipartAutoConfiguration,裡面對應的元件

@EnableConfigurationProperties(MultipartProperties.class)

中預設聲明瞭檔案大小,單張照片最大1MB,最多總請求量最大10MB

@ConfigurationProperties(prefix = "spring.servlet.multipart", ignoreUnknownFields = false)
public class MultipartProperties {

    /**
     * Whether to enable support of multipart uploads.
     */
    private boolean enabled = true;

    /**
     * Intermediate location of uploaded files.
     */
    private String location;

    /**
     * Max file size.
     */
    private DataSize maxFileSize = DataSize.ofMegabytes(1);

    /**
     * Max request size.
     */
    private DataSize maxRequestSize = DataSize.ofMegabytes(10);

    /**
     * Threshold after which files are written to disk.
     */
    private DataSize fileSizeThreshold = DataSize.ofBytes(0);

    /**
     * Whether to resolve the multipart request lazily at the time of file or parameter
     * access.
     */
    private boolean resolveLazily = false;
View Code