欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文徹底弄懂Java中MultipartFile接口和File類

 更新時(shí)間:2023年11月20日 15:33:15   作者:荔枝當(dāng)大佬  
MultipartFile是一個(gè)接口,我們可以理解為是Spring?給我們綁定的一個(gè)在使用文件上傳等時(shí)簡(jiǎn)便實(shí)現(xiàn)的口子,這篇文章主要給大家介紹了關(guān)于如何通過一文徹底弄懂Java中MultipartFile接口和File類的相關(guān)資料,需要的朋友可以參考下

一、File類

java.io.File是 Java 標(biāo)準(zhǔn)庫中用于操作文件和目錄路徑的類。它提供了很多方法,用于創(chuàng)建、刪除、重命名、判斷文件是否存在、獲取文件信息等操作。

獲取文件信息

  • boolean exists(): 判斷文件或目錄是否存在。
  • boolean isFile(): 判斷是否是文件。
  • boolean isDirectory(): 判斷是否是目錄。
  • String getName(): 獲取文件或目錄的名稱。
  • String getPath(): 獲取文件或目錄的路徑。
  • String getAbsolutePath(): 獲取文件或目錄的絕對(duì)路徑。
  • long length(): 獲取文件的大?。ㄗ止?jié)數(shù))。

文件和目錄操作

  • boolean createNewFile(): 創(chuàng)建新文件。如果文件已存在,則不創(chuàng)建,返回 false。
  • boolean mkdir(): 創(chuàng)建新目錄。如果目錄已存在,則不創(chuàng)建,返回 false
  • boolean mkdirs(): 創(chuàng)建新目錄及其父目錄,如果不存在的話。
  • boolean delete(): 刪除文件或目錄。

文件路徑操作

  • boolean renameTo(File dest): 重命名文件或目錄。如果成功,返回 true;否則,返回 false。
  • String[] list(): 返回目錄下的文件和目錄名數(shù)組。
  • File[] listFiles(): 返回目錄下的文件和目錄的 File 對(duì)象數(shù)組。

文件過濾

  • String[] list(FilenameFilter filter): 返回目錄下滿足指定過濾器條件的文件和目錄名數(shù)組。
  • File[] listFiles(FileFilter filter): 返回目錄下滿足指定過濾器條件的文件和目錄的 File 對(duì)象數(shù)組。

二、MultipartFile接口

MultipartFile是 Spring 框架提供的一個(gè)接口,用于表示處理文件上傳的對(duì)象。它通常用于處理multipart/form-data類型的請(qǐng)求,例如處理文件上傳的表單。首先我們依舊可以通過源碼的學(xué)習(xí)來進(jìn)一步了解這個(gè)接口。

2.1 源碼和方法功能 

public interface MultipartFile extends InputStreamSource {
    String getName();

    @Nullable
    String getOriginalFilename();

    @Nullable
    String getContentType();

    boolean isEmpty();

    long getSize();

    byte[] getBytes() throws IOException;

    InputStream getInputStream() throws IOException;

    default Resource getResource() {
        return new MultipartFileResource(this);
    }

    void transferTo(File dest) throws IOException, IllegalStateException;

    default void transferTo(Path dest) throws IOException, IllegalStateException {
        FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest));
    }
}
  • String getName():獲取上傳文件的表單字段名稱
  • String getOriginalFilename():獲取上傳文件的原始文件名
  • String getContentType():獲取上傳文件的內(nèi)容類型
  • boolean isEmpty():判斷上傳文件是否為空
  • long getSize():獲取上傳文件的大小,單位是字節(jié)
  • byte[] getBytes() throws IOException:獲取上傳文件的字節(jié)數(shù)組表示
  • InputStream getInputStream() throws IOException:獲取上傳文件的輸入流
  • default Resource getResource() :將 MultipartFile 封裝成了 Resource 對(duì)象,從而可以使用 Resource 接口提供的方法來操作上傳文件的內(nèi)容。
  • void transferTo(File dest) throws IOException, IllegalStateException:將上傳文件保存到指定的文件;
  • default void transferTo(Path dest) throws IOException, IllegalStateException :將上傳文件保存在指定的路徑下;

2.2 void transferTo(File dest)

前面我們已經(jīng)介紹了該方法是Spring中提供的將上傳文件保存到指定的文件中的抽象方法,溯源源碼我們可以看到這個(gè)接口方法被三個(gè)實(shí)現(xiàn)類實(shí)現(xiàn)了,分別是CommonsMultipartFile、MockMultipartFile 和 StandardMultipartHttpServletRequest。

CommonsMultipartFile中的方法體

我們可以看到CommonsMultipartFile中的方法體主要是通過檢測(cè)傳進(jìn)來的文件是否可用、是否存在,并在檢測(cè)完成就執(zhí)行寫入的操作

public void transferTo(File dest) throws IOException, IllegalStateException {
        if (!this.isAvailable()) {
            throw new IllegalStateException("File has already been moved - cannot be transferred again");
        } else if (dest.exists() && !dest.delete()) {
            throw new IOException("Destination file [" + dest.getAbsolutePath() + "] already exists and could not be deleted");
        } else {
            try {
                this.fileItem.write(dest);
                LogFormatUtils.traceDebug(logger, (traceOn) -> {
                    String action = "transferred";
                    if (!this.fileItem.isInMemory()) {
                        action = this.isAvailable() ? "copied" : "moved";
                    }

                    return "Part '" + this.getName() + "',  filename '" + this.getOriginalFilename() + "'" + (traceOn ? ", stored " + this.getStorageDescription() : "") + ": " + action + " to [" + dest.getAbsolutePath() + "]";
                });
            } catch (FileUploadException var3) {
                throw new IllegalStateException(var3.getMessage(), var3);
            } catch (IOException | IllegalStateException var4) {
                throw var4;
            } catch (Exception var5) {
                throw new IOException("File transfer failed", var5);
            }
        }
    }

上面這段demo中可能對(duì)于this.isAvailable()有疑問,我們知曉這里的this其實(shí)是該類的實(shí)例化對(duì)象,但是這里的this.isAvailable()就是拿來判斷目的文件是否可用,調(diào)用的就是類的內(nèi)部方法,判斷是否可用的條件就是該目標(biāo)文件是否被加載進(jìn)內(nèi)存中!

這里給出一個(gè)使用該方法的例子,需要注意的是這時(shí)候方法要求的是一個(gè)目標(biāo)File對(duì)象,我們需要在調(diào)用該目標(biāo)方法的時(shí)候就根據(jù)目標(biāo)路徑創(chuàng)建了目標(biāo)的File對(duì)象。

// 獲取上傳文件的原始文件名
String originalFilename = StringUtils.cleanPath(file.getOriginalFilename());

// 構(gòu)建目標(biāo)文件對(duì)象
File destFile = new File("/path/to/destination/directory", originalFilename);

try {
    // 將上傳文件保存到目標(biāo)文件
    file.transferTo(destFile);
    return "File uploaded successfully!";
} catch (IOException e) {
    e.printStackTrace();
    return "Failed to upload the file.";
}

StandardMultipartHttpServletRequest實(shí)現(xiàn)類 

而另一個(gè)實(shí)現(xiàn)類StandardMultipartHttpServletRequest和CommonsMultipartFile的區(qū)別就在于使用StandardMultipartHttpServletRequest直接上傳文件的話可能會(huì)出現(xiàn)目錄跳躍的問題,而CommonsMultipartFile不會(huì),這是因?yàn)槠鋵?duì)路勁分隔符了相關(guān)的限制,具體的部分大家可以看看這篇博客:http://www.dbjr.com.cn/program/3053831or.htm 而MockMultipartFile這個(gè)實(shí)現(xiàn)類就更簡(jiǎn)單了,做了簡(jiǎn)單的輸入輸出流的copy,這里就不再水字?jǐn)?shù)了。

2.3 default void transferTo(Path dest)

該默認(rèn)方法在實(shí)現(xiàn)類中被重寫了,但主要的功能還是不變,就是將上傳的文件寫入到指定路徑的Path對(duì)象中實(shí)現(xiàn)文件上傳的功能。 

這里給出使用的示例代碼:

// 構(gòu)建目標(biāo)文件路徑
String uploadDirectory = "/path/to/destination/directory";
String originalFilename = file.getOriginalFilename();
Path filePath = Paths.get(uploadDirectory, originalFilename);

try {
// 將上傳文件保存到目標(biāo)文件
    file.transferTo(filePath);
    return "File uploaded successfully!";
} catch (IOException e) {
    e.printStackTrace();
    return "Failed to upload the file.";
}

總結(jié)

這篇文章主要圍繞MultipartFile接口和File類中相關(guān)方法的功能進(jìn)行梳理,其中有關(guān)文件寫入File對(duì)象和Path對(duì)象重點(diǎn)進(jìn)行了剖析,而具體的有關(guān)文件管理的部分知識(shí)大家可以關(guān)注后續(xù)荔枝梳理的有關(guān)SpringBoot整合MinIO的博客和后續(xù)的博文輸出。

到此這篇關(guān)于Java中MultipartFile接口和File類的文章就介紹到這了,更多相關(guān)Java MultipartFile接口和File類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java設(shè)計(jì)模式之裝飾器模式(Decorator)

    java設(shè)計(jì)模式之裝飾器模式(Decorator)

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之裝飾器模式Decorator,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Java JVM字節(jié)碼指令集總結(jié)整理與介紹

    Java JVM字節(jié)碼指令集總結(jié)整理與介紹

    本節(jié)將會(huì)著重介紹一下JVM中的指令集、Java是如何跨平臺(tái)的、JVM指令集參考手冊(cè)等內(nèi)容。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Java從源碼角度解析SpringMVC執(zhí)行流程

    Java從源碼角度解析SpringMVC執(zhí)行流程

    這篇文章主要介紹了Java從源碼角度解析SpringMVC執(zhí)行流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java簡(jiǎn)單幾步實(shí)現(xiàn)一個(gè)二叉搜索樹

    Java簡(jiǎn)單幾步實(shí)現(xiàn)一個(gè)二叉搜索樹

    二叉樹包含了根節(jié)點(diǎn),孩子節(jié)點(diǎn),葉節(jié)點(diǎn),每一個(gè)二叉樹只有一個(gè)根節(jié)點(diǎn),每一個(gè)結(jié)點(diǎn)最多只有兩個(gè)節(jié)點(diǎn),左子樹的鍵值小于根的鍵值,右子樹的鍵值大于根的鍵值,下面這篇文章主要給大家介紹了關(guān)于如何在Java中實(shí)現(xiàn)二叉搜索樹的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • 利用Java獲取文件名、類名、方法名和行號(hào)的方法小結(jié)

    利用Java獲取文件名、類名、方法名和行號(hào)的方法小結(jié)

    這篇文章運(yùn)用實(shí)例代碼給大家介紹了利用Java怎樣獲取文件名、類名、方法名和行號(hào),有需要的可以參考借鑒,下面一起來看看吧。
    2016-08-08
  • spring中的注解事務(wù)演示和添加步驟詳情

    spring中的注解事務(wù)演示和添加步驟詳情

    這篇文章主要介紹了spring中的注解事務(wù)演示和添加步驟詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • vue3使用vue-diff工具來比較數(shù)據(jù)差異

    vue3使用vue-diff工具來比較數(shù)據(jù)差異

    這篇文章主要為大家詳細(xì)介紹了vue3如何使用vue-diff工具來比較數(shù)據(jù)差異,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • Java實(shí)現(xiàn)上傳和下載功能(支持多個(gè)文件同時(shí)上傳)

    Java實(shí)現(xiàn)上傳和下載功能(支持多個(gè)文件同時(shí)上傳)

    這篇文章主要介紹了Java實(shí)現(xiàn)上傳和下載功能,支持多個(gè)文件同時(shí)上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • java中的過濾器 Filter應(yīng)用小結(jié)

    java中的過濾器 Filter應(yīng)用小結(jié)

    文章主要介紹了Java Web中的過濾器(Filter)的基本概念、生命周期、配置和應(yīng)用,過濾器可以攔截請(qǐng)求和響應(yīng),用于執(zhí)行一些預(yù)處理或后處理操作,如設(shè)置編碼、校驗(yàn)用戶身份等,感興趣的朋友一起看看吧
    2025-03-03
  • spring?boot項(xiàng)目自定義參數(shù)校驗(yàn)規(guī)則示例詳解

    spring?boot項(xiàng)目自定義參數(shù)校驗(yàn)規(guī)則示例詳解

    這篇文章主要介紹了spring boot項(xiàng)目如何自定義參數(shù)校驗(yàn)規(guī)則,自定義校驗(yàn)規(guī)則和自帶的規(guī)則實(shí)現(xiàn)方式一樣,先自定義一個(gè)注解,然后指定校驗(yàn)類,在校驗(yàn)類里實(shí)現(xiàn)具體的校驗(yàn)規(guī)則,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07

最新評(píng)論