關(guān)于File與MultipartFile的用法概述
1.MultipartFile 概述
MultipartFile是SpringMVC提供簡化文件流操作的接口,該接口實現(xiàn)類有如下幾個
在不使用框架之前,都是使用原生的HttpServletRequest來接收上傳的數(shù)據(jù)的,如下所示:
public String fileSave(HttpServletRequest request, HttpServletResponse response){ MultipartHttpServletRequest msr = (MultipartHttpServletRequest) request; MultipartFile targetFile = msr.getFile("file"); }
此處附上處理文件的一般操作
// MultipartFile targetFile // 文件寫入路徑 每次寫文件的時候要保證 路徑唯一 不會發(fā)生寫入文件覆蓋的問題 String fileName = targetFile.getOriginalFilename(); LOGGER.info("fileOnlineShowServiceImpl ==> fileSave() fileName : {}", fileName); // 臨時將文件存放本地存儲位置 String tempFilePath = downloadPath + File.separator + ToolsUtil.createUUID() + "_" + fileName; // 將文件寫入到本地 localPath targetFile.transferTo(new File(tempFilePath)); LOGGER.info("fileOnlineShowServiceImpl ==> fileSave() tempFilePath : {}", tempFilePath); // 將內(nèi)存的文件上傳阿里云OSS,并轉(zhuǎn)換成圖片,返回對應(yīng)的信息 Map<String, String> fileInfoMaps = fileDealWithService.dealWithFileService(ComonConstant.DIGIT_LONG_ONE, tempFilePath, Boolean.TRUE); // 將寫入后的數(shù)據(jù)新增到數(shù)據(jù)記錄表中 addNewRecorde(fileSaveReqDTO, fileInfoMaps , yhSystemUsers);
文件是以二進制流傳遞到后端的,然后需要我們自己轉(zhuǎn)換為File類。
使用MultipartFile接口中提供的實現(xiàn)方法,我們對文件處理的操作就會變得很便捷。
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)化成一個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 寫入到指定路徑 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.
// 臨時將文件存放本地存儲位置 String tempFilePath = downloadPath + File.separator + ToolsUtil.createUUID() + "_" + fileName; // 將文件寫入到本地 downloadPath targetFile.transferTo(new File(tempFilePath));
同時想必大家平時也經(jīng)常做過類似的處理,常見的如下操作:
public void writeFileToLocal(MultipartFile targetFile) { //開始時間 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 ==> 耗時:" + Duration.between(startTime, LocalDateTime.now()).toMillis()); } catch (Exception e) { LOGGER.info("writeFileToLocal 文件寫入失敗"); }finally { if (null != bufferedReader) { try { bufferedReader.close(); } catch (IOException e) { LOGGER.info("writeFileToLocal 文件寫入失敗"); } } if (null != bufferedWriter) { try { bufferedWriter.close(); } catch (IOException e) { LOGGER.info("writeFileToLocal 文件寫入失敗"); } } } }
3.File 轉(zhuǎn) MultipartFile
概述中有講到Spring提供了MultipartFile 接口四個實現(xiàn)類,我們只需將File對象傳入到對應(yīng)實現(xiàn)類的構(gòu)造方法中,即可實現(xiàn)File 轉(zhuǎn) MultipartFile,此處提供一個案例如下所示:
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)常會去對路徑提取文件名,以及文件類型,下面貼出集中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
// 獲取最后一個"."切割符后的字符串 往往用作獲取文件類型 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
// 獲取最后一個切割符"_"前的字符串 String textType = "Af_yta_sder.pdf"; String subRet = StringUtils.substringBeforeLast(textType, "_"); System.out.println("subRet = " + subRet );
subRet = Af_yta
其他類似的方法大同小異,此處就不一一列舉了。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java 將字符串動態(tài)生成字節(jié)碼的實現(xiàn)方法
本篇文章主要是對Java將字符串動態(tài)生成字節(jié)碼的實現(xiàn)方法進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01springboot的異步任務(wù):無返回值和有返回值問題
這篇文章主要介紹了springboot的異步任務(wù):無返回值和有返回值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07Java中ArrayList和LinkedList的遍歷與性能分析
這篇文章主要給大家介紹了ArrayList和LinkedList這兩種list的五種循環(huán)遍歷方式,各種方式的性能測試對比,根據(jù)ArrayList和LinkedList的源碼實現(xiàn)分析性能結(jié)果,總結(jié)結(jié)論。相信對大家的理解和學(xué)習(xí)具有一定的參考價值,有需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2016-12-12SpringBoot多數(shù)據(jù)源配置并通過注解實現(xiàn)動態(tài)切換數(shù)據(jù)源
本文主要介紹了SpringBoot多數(shù)據(jù)源配置并通過注解實現(xiàn)動態(tài)切換數(shù)據(jù)源,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08java使用POI批量導(dǎo)入excel數(shù)據(jù)的方法
這篇文章主要為大家詳細介紹了java使用POI批量導(dǎo)入excel數(shù)據(jù)的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07