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

關(guān)于File與MultipartFile的用法概述

 更新時(shí)間:2023年09月22日 09:32:40   作者:葉楓^_^  
這篇文章主要介紹了關(guān)于File與MultipartFile的用法概述,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1.MultipartFile 概述

MultipartFile是SpringMVC提供簡(jiǎn)化文件流操作的接口,該接口實(shí)現(xiàn)類有如下幾個(gè)

在這里插入圖片描述

在不使用框架之前,都是使用原生的HttpServletRequest來(lái)接收上傳的數(shù)據(jù)的,如下所示:

public String fileSave(HttpServletRequest request, HttpServletResponse response){
	MultipartHttpServletRequest msr = (MultipartHttpServletRequest) request;
    MultipartFile targetFile = msr.getFile("file");
}

此處附上處理文件的一般操作

// MultipartFile targetFile
// 文件寫(xiě)入路徑 每次寫(xiě)文件的時(shí)候要保證 路徑唯一 不會(huì)發(fā)生寫(xiě)入文件覆蓋的問(wèn)題
String fileName = targetFile.getOriginalFilename();
LOGGER.info("fileOnlineShowServiceImpl  ==> fileSave() fileName : {}", fileName);
// 臨時(shí)將文件存放本地存儲(chǔ)位置
String tempFilePath = downloadPath + File.separator + ToolsUtil.createUUID() + "_" + fileName;
// 將文件寫(xiě)入到本地 localPath
targetFile.transferTo(new File(tempFilePath));
LOGGER.info("fileOnlineShowServiceImpl ==> fileSave() tempFilePath : {}", tempFilePath);
// 將內(nèi)存的文件上傳阿里云OSS,并轉(zhuǎn)換成圖片,返回對(duì)應(yīng)的信息
Map<String, String> fileInfoMaps = fileDealWithService.dealWithFileService(ComonConstant.DIGIT_LONG_ONE, tempFilePath, Boolean.TRUE);
// 將寫(xiě)入后的數(shù)據(jù)新增到數(shù)據(jù)記錄表中
addNewRecorde(fileSaveReqDTO, fileInfoMaps , yhSystemUsers);

文件是以二進(jìn)制流傳遞到后端的,然后需要我們自己轉(zhuǎn)換為File類。

使用MultipartFile接口中提供的實(shí)現(xiàn)方法,我們對(duì)文件處理的操作就會(huì)變得很便捷。

MultipartFile接口方法如下:

package org.springframework.web.multipart;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import org.springframework.core.io.InputStreamSource;
import org.springframework.core.io.Resource;
import org.springframework.lang.Nullable;
import org.springframework.util.FileCopyUtils;
public interface MultipartFile extends InputStreamSource {
	//返回參數(shù)的名稱
    String getName();
	// 獲取源文件的名稱
    @Nullable
    String getOriginalFilename();
	// 返回文件的內(nèi)容類型
    @Nullable
    String getContentType();
	// 判斷文件內(nèi)容是否為空
    boolean isEmpty();
	// 返回文件大小 以字節(jié)為單位
    long getSize();
	// 將文件內(nèi)容轉(zhuǎn)化成一個(gè)byte[] 返回
    byte[] getBytes() throws IOException;
	// 返回輸入的文件流
    InputStream getInputStream() throws IOException;
    default Resource getResource() {
        return new MultipartFileResource(this);
    }
    void transferTo(File var1) throws IOException, IllegalStateException;
	// 將MultipartFile 轉(zhuǎn)換換成 File 寫(xiě)入到指定路徑
    default void transferTo(Path dest) throws IOException, IllegalStateException {
        FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest));
    }
}

2.MultipartFile 轉(zhuǎn)File

知悉了MultipartFile 后,我們知道MultipartFile 內(nèi)部提供了MultipartFile 轉(zhuǎn)File.

// 臨時(shí)將文件存放本地存儲(chǔ)位置
String tempFilePath = downloadPath + File.separator + ToolsUtil.createUUID() + "_" + fileName;
// 將文件寫(xiě)入到本地 downloadPath
targetFile.transferTo(new File(tempFilePath));

同時(shí)想必大家平時(shí)也經(jīng)常做過(guò)類似的處理,常見(jiàn)的如下操作:

public void writeFileToLocal(MultipartFile targetFile) {
        //開(kāi)始時(shí)間
        LocalDateTime startTime = LocalDateTime.now();
        BufferedInputStream bufferedReader = null;
        BufferedOutputStream bufferedWriter = null;
        try {
            bufferedReader = new BufferedInputStream(targetFile.getInputStream());
            bufferedWriter = new BufferedOutputStream(new FileOutputStream(downloadPath + File.separator +targetFile.getOriginalFilename()));
            int len=0;
            //字節(jié)緩沖區(qū)
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            while ((len = bufferedReader.read(buffer.array())) != -1) {
                bufferedWriter.write(buffer.array(),0,len);
                bufferedWriter.flush();
            }
            LOGGER.info("writeFileToLocal ==> 耗時(shí):" + Duration.between(startTime, LocalDateTime.now()).toMillis());
        } catch (Exception e) {
            LOGGER.info("writeFileToLocal 文件寫(xiě)入失敗");
        }finally {
            if (null != bufferedReader) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    LOGGER.info("writeFileToLocal 文件寫(xiě)入失敗");
                }
            }
            if (null != bufferedWriter) {
                try {
                    bufferedWriter.close();
                } catch (IOException e) {
                    LOGGER.info("writeFileToLocal 文件寫(xiě)入失敗");
                }
            }
        }
    }

3.File 轉(zhuǎn) MultipartFile

概述中有講到Spring提供了MultipartFile 接口四個(gè)實(shí)現(xiàn)類,我們只需將File對(duì)象傳入到對(duì)應(yīng)實(shí)現(xiàn)類的構(gòu)造方法中,即可實(shí)現(xiàn)File 轉(zhuǎn) MultipartFile,此處提供一個(gè)案例如下所示:

File file = new File(filePath);  // 文件路徑
FileInputStream input = new FileInputStream(file);
// File 轉(zhuǎn) MultipartFile
MultipartFile targetFiles = new MockMultipartFile("targetFiles",file.getName(),null,IOUtils.toByteArray(input));
String fileName = targetFiles.getOriginalFilename(); // 源文件名

我們經(jīng)常會(huì)去對(duì)路徑提取文件名,以及文件類型,下面貼出集中l(wèi)ang3提供的常用的方法

(1).substringAfter

// 切割文件路徑 獲取"_"后的文件名
String textType = "Af_yta_sder.pdf";
String subRet = StringUtils.substringAfter(textType, "_");
System.out.println("subRet  = " + subRet );

輸出結(jié)果:

subRet  = yta_sder.pdf

(2).substringAfterLast

// 獲取最后一個(gè)"."切割符后的字符串 往往用作獲取文件類型
String textType = "Af_yta_sder.pdf";
String subRet = StringUtils.substringAfterLast(textType, ".");
System.out.println("subRet  = " + subRet );

輸出結(jié)果:

subRet  = pdf

(3).substringBefore

// 獲取"."切割符前的字符串 往往用作獲取文件名
String textType = "Af_yta_sder.pdf";
String subRet = StringUtils.substringBefore(textType, ".");
System.out.println("subRet  = " + subRet );

輸出結(jié)果:

subRet  = Af_yta_sder

(4).substringBeforeLast

// 獲取最后一個(gè)切割符"_"前的字符串
String textType = "Af_yta_sder.pdf";
String subRet = StringUtils.substringBeforeLast(textType, "_");
System.out.println("subRet  = " + subRet );

subRet  = Af_yta

其他類似的方法大同小異,此處就不一一列舉了。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringMVC實(shí)現(xiàn)文件上傳和下載的工具類

    SpringMVC實(shí)現(xiàn)文件上傳和下載的工具類

    這篇文章主要為大家詳細(xì)介紹了SpringMVC實(shí)現(xiàn)文件上傳和下載的工具類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Java 將字符串動(dòng)態(tài)生成字節(jié)碼的實(shí)現(xiàn)方法

    Java 將字符串動(dòng)態(tài)生成字節(jié)碼的實(shí)現(xiàn)方法

    本篇文章主要是對(duì)Java將字符串動(dòng)態(tài)生成字節(jié)碼的實(shí)現(xiàn)方法進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2014-01-01
  • springboot bootcdn使用示例詳解

    springboot bootcdn使用示例詳解

    這篇文章主要介紹了springboot bootcdn使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • springboot的異步任務(wù):無(wú)返回值和有返回值問(wèn)題

    springboot的異步任務(wù):無(wú)返回值和有返回值問(wèn)題

    這篇文章主要介紹了springboot的異步任務(wù):無(wú)返回值和有返回值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java中ArrayList和LinkedList的遍歷與性能分析

    Java中ArrayList和LinkedList的遍歷與性能分析

    這篇文章主要給大家介紹了ArrayList和LinkedList這兩種list的五種循環(huán)遍歷方式,各種方式的性能測(cè)試對(duì)比,根據(jù)ArrayList和LinkedList的源碼實(shí)現(xiàn)分析性能結(jié)果,總結(jié)結(jié)論。相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考價(jià)值,有需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2016-12-12
  • java中對(duì)List分段操作的實(shí)例

    java中對(duì)List分段操作的實(shí)例

    這篇文章主要介紹了java中對(duì)List分段操作的實(shí)例的相關(guān)資料,希望通過(guò)本文大家能夠掌握l(shuí)ist的分段實(shí)現(xiàn)方法,需要的朋友可以參考下
    2017-09-09
  • 使用工具類-java精確到小數(shù)點(diǎn)后6位

    使用工具類-java精確到小數(shù)點(diǎn)后6位

    這篇文章主要介紹了使用工具類-java精確到小數(shù)點(diǎn)后6位,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • SpringBoot多數(shù)據(jù)源配置并通過(guò)注解實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源

    SpringBoot多數(shù)據(jù)源配置并通過(guò)注解實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源

    本文主要介紹了SpringBoot多數(shù)據(jù)源配置并通過(guò)注解實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • java使用POI批量導(dǎo)入excel數(shù)據(jù)的方法

    java使用POI批量導(dǎo)入excel數(shù)據(jù)的方法

    這篇文章主要為大家詳細(xì)介紹了java使用POI批量導(dǎo)入excel數(shù)據(jù)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 基于Java回顧之I/O的使用詳解

    基于Java回顧之I/O的使用詳解

    我計(jì)劃在接下來(lái)的幾篇文章中快速回顧一下Java,主要是一些基礎(chǔ)的JDK相關(guān)的內(nèi)容
    2013-05-05

最新評(píng)論