一、SpringBoot文件上傳基礎(chǔ)

SpringBoot為文件上傳提供了開(kāi)箱即用的支持。通過(guò)簡(jiǎn)單的配置即可實(shí)現(xiàn)文件上傳的基本功能。首先需要在pom.xml中引入SpringBoot的Web依賴(lài):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

然后在application.properties中配置文件上傳的相關(guān)屬性,例如最大文件大小、上傳路徑等:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.location=/upload

接下來(lái)在Controller中編寫(xiě)上傳邏輯:

@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
    // 文件上傳處理邏輯
    return "上傳成功";
}

至此,一個(gè)基本的文件上傳功能就已經(jīng)實(shí)現(xiàn)了。用戶(hù)可以通過(guò)表單的file輸入域?qū)⑽募蟼鞯椒?wù)器。

二、圖片上傳功能實(shí)現(xiàn)

文件上傳的基礎(chǔ)功能已經(jīng)介紹完畢,下面我們來(lái)專(zhuān)注于實(shí)現(xiàn)圖片上傳的具體應(yīng)用場(chǎng)景。首先需要確定文件存儲(chǔ)的位置和命名規(guī)則。我們可以將文件存儲(chǔ)在服務(wù)器的磁盤(pán)上,并以文件上傳時(shí)的時(shí)間戳命名。為此,我們需要編寫(xiě)一個(gè)文件工具類(lèi):

public class FileUtil {
    public static String upload(MultipartFile file) {
        // 生成文件名
        String fileName = System.currentTimeMillis() + file.getOriginalFilename();
        // 指定文件存儲(chǔ)路徑
        File dest = new File("upload/" + fileName);
        try {
            file.transferTo(dest);
            return fileName;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

有了文件工具類(lèi)后,我們可以在Controller中調(diào)用它來(lái)實(shí)現(xiàn)圖片上傳功能:

@PostMapping("/upload/image")
public String uploadImage(@RequestParam("image") MultipartFile file) {
    String fileName = FileUtil.upload(file);
    if (fileName != null) {
        // 返回上傳成功的文件名
        return fileName;
    } else {
        return "上傳失敗";
    }
}

三、返回上傳文件路徑

在實(shí)際應(yīng)用中,我們通常需要返回上傳文件的訪(fǎng)問(wèn)路徑,以便前端能夠正確顯示和使用該文件。為此,我們可以在application.properties中配置文件訪(fǎng)問(wèn)的基礎(chǔ)路徑:

spring.mvc.static-path-pattern=/upload/**

這樣,我們就可以在Controller中返回文件的完整訪(fǎng)問(wèn)路徑:

@PostMapping("/upload/image")
public String uploadImage(@RequestParam("image") MultipartFile file) {
    String fileName = FileUtil.upload(file);
    if (fileName != null) {
        return "http://localhost:8080/upload/" + fileName;
    } else {
        return "上傳失敗";
    }
}

四、支持多文件上傳

除了單文件上傳,SpringBoot還支持多文件同時(shí)上傳。我們只需要將Controller方法的參數(shù)改為MultipartFile數(shù)組即可:

@PostMapping("/upload/images")
public List<String> uploadImages(@RequestParam("images") MultipartFile[] files) {
    List<String> fileNames = new ArrayList<>();
    for (MultipartFile file : files) {
        String fileName = FileUtil.upload(file);
        fileNames.add(fileName);
    }
    return fileNames;
}

五、文件上傳異常處理

在文件上傳的過(guò)程中可能會(huì)遇到各種異常情況,例如文件太大、文件格式不支持等。我們需要對(duì)這些異常進(jìn)行捕獲和處理,為用戶(hù)提供友好的錯(cuò)誤提示。SpringBoot提供了強(qiáng)大的異常處理機(jī)制,我們可以通過(guò)定義ControllerAdvice來(lái)集中處理各種異常:

@ControllerAdvice
public class FileExceptionHandler {
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public String handleMaxSizeException(MaxUploadSizeExceededException e) {
        return "文件太大,請(qǐng)上傳10MB以?xún)?nèi)的文件";
    }

    @ExceptionHandler(IOException.class)
    public String handleIOException(IOException e) {
        return "文件上傳失敗,請(qǐng)稍后重試";
    }
}

六、總結(jié)

通過(guò)本文的詳細(xì)介紹,相信你已經(jīng)掌握了SpringBoot文件上傳的方方面面。從基礎(chǔ)的單文件上傳到支持多文件上傳,再到異常處理等高級(jí)應(yīng)用,SpringBoot為我們提供了非常強(qiáng)大和靈活的文件管理能力。希望這些內(nèi)容對(duì)你在實(shí)際項(xiàng)目中的文件上傳需求有所幫助。