Java中MultipartFile與File互轉(zhuǎn)的實(shí)現(xiàn)
前言
需求是上傳Excel文件并讀取Excel文件中的內(nèi)容,根據(jù)獲取的數(shù)據(jù)執(zhí)行完某些業(yè)務(wù)操作后再將一些數(shù)據(jù)寫回到excel中。前臺(tái)使用FormData表單的方式請(qǐng)求后臺(tái),后臺(tái)接收類型是MultipartFile,放置文件過(guò)大時(shí)會(huì)造成內(nèi)存溢出需要轉(zhuǎn)換為File類型
MultipartFile轉(zhuǎn)File
其實(shí)轉(zhuǎn)換的本質(zhì)都是要?jiǎng)?chuàng)建一個(gè)file的臨時(shí)文件,然后通過(guò)各種實(shí)現(xiàn)方式將MultipartFile中的內(nèi)容寫入到file中
1.FileUtils.copyInputStreamToFile轉(zhuǎn)換
package com.cxstar.file.util;
import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
/**
* @author zhouquan
* @description 測(cè)試MultipartFile與File互轉(zhuǎn)
* @date 2023-03-12 17:31
**/
public class FileTestUtils {
/**
* MultipartFile轉(zhuǎn)File
* <p>
* 項(xiàng)目根路徑創(chuàng)建臨時(shí)文件,轉(zhuǎn)換得到File,再刪除臨時(shí)文件
*
* @param multipartFile
* @return
*/
public static File multiPartFileToFile(MultipartFile multipartFile) throws IOException {
//獲取文件名
String originalFilename = multipartFile.getOriginalFilename();
//獲取默認(rèn)定位到的當(dāng)前用戶目錄("user.dir"),也就是當(dāng)前應(yīng)用的根路徑
String tempDir = System.getProperty("user.dir");
//根目錄下生成臨時(shí)文件
File file = new File(tempDir+File.separator+originalFilename);
FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
return file;
}
}
此種方式的弊端就是需要在調(diào)用此方法后需要再手動(dòng)刪除,也就是要在業(yè)務(wù)代碼中再摻雜刪除的邏輯。
2.multipartFile.transferTo(tempFile);
/**
* MultipartFile轉(zhuǎn)File
* <p>
* 項(xiàng)目根路徑創(chuàng)建緩沖區(qū)來(lái)實(shí)現(xiàn)這個(gè)轉(zhuǎn)換
*
* @param multipartFile
* @return
*/
public static File multiPartFileToFile2(MultipartFile multipartFile) throws IOException {
//獲取文件名
String originalFilename = multipartFile.getOriginalFilename();
//獲取默認(rèn)定位到的當(dāng)前用戶目錄("user.dir"),也就是當(dāng)前應(yīng)用的根路徑
String tempDir = System.getProperty("user.dir");
//獲取文件名
String filename = StringUtils.substringBeforeLast(originalFilename, ".");
//獲取文件后綴
String fileExt = StringUtils.substringAfterLast(originalFilename, ".");
//在項(xiàng)目根路徑生成臨時(shí)文件
File tempFile = File.createTempFile(filename, "." + fileExt, new File(tempDir));
multipartFile.transferTo(tempFile);
//在jvm退出時(shí)執(zhí)行刪除此路徑下的文件
tempFile.deleteOnExit();
return tempFile;
}
注意:
1.防止生成的臨時(shí)文件,createTempFile()方法會(huì)在文件名后添加隨機(jī)碼
2.生成的文件不會(huì)立馬刪除,而是在jvm退出時(shí)執(zhí)行刪除此路徑下的文件

3. (推薦)FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());
package com.cxstar.file.util;
import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
/**
* @author zhouquan
* @description 測(cè)試MultipartFile與File互轉(zhuǎn)
* @date 2023-03-12 17:31
**/
public class FileTestUtils {
/**
* MultipartFile 轉(zhuǎn) File
*
* @param multipartFile
* @throws Exception
*/
public static File multiPartFileToFile3(MultipartFile multipartFile) {
File file = null;
if (multipartFile.isEmpty()) {
return null;
}
try {
//本質(zhì)上還是在項(xiàng)目根路徑創(chuàng)建文件
file = new File(multipartFile.getOriginalFilename());
//將MultipartFile的byte[]寫入到file中
FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
return file;
}
}
此種方式相較于第二種方式,文件名不會(huì)發(fā)生改變,當(dāng)然還是要手動(dòng)刪除

File轉(zhuǎn)MultipartFile
MultipartFile文件上傳時(shí),其實(shí)springmvc已經(jīng)轉(zhuǎn)為StandardMultipartFile子類型
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile

MultipartFile是一個(gè)接口,因此轉(zhuǎn)成MultipartFile格式需要轉(zhuǎn)成實(shí)現(xiàn)MultipartFile接口的實(shí)現(xiàn)類即可

package com.cxstar.file.util;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
/**
* @author zhouquan
* @description 測(cè)試MultipartFile與File互轉(zhuǎn)
* @date 2023-03-12 17:31
**/
public class FileTestUtils {
public static MultipartFile getMultipartFile(File file) throws Exception {
MultipartFile multipartFile = new MockMultipartFile(file.getName(), new FileInputStream(file));
return multipartFile;
}
到此這篇關(guān)于Java中MultipartFile與File互轉(zhuǎn)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java MultipartFile與File互轉(zhuǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你怎么用Python處理excel實(shí)現(xiàn)自動(dòng)化辦公
這篇文章主要介紹了教你怎么用Python處理excel實(shí)現(xiàn)自動(dòng)化辦公,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
python利用裝飾器進(jìn)行運(yùn)算的實(shí)例分析
本文主要是通過(guò)使用Python的裝飾器來(lái)做一個(gè)運(yùn)算的實(shí)例,來(lái)給大家詳細(xì)介紹下Python的裝飾器,非常的實(shí)用,有需要的小伙伴可以參考下。2015-08-08
Python使用指定字符長(zhǎng)度切分?jǐn)?shù)據(jù)示例
今天小編就為大家分享一篇Python使用指定字符長(zhǎng)度切分?jǐn)?shù)據(jù)示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
Pycharm+django2.2+python3.6+MySQL實(shí)現(xiàn)簡(jiǎn)單的考試報(bào)名系統(tǒng)
這篇文章主要介紹了Pycharm+django2.2+python3.6+MySQL實(shí)現(xiàn)簡(jiǎn)單的考試報(bào)名系統(tǒng),本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
selenium獲取元素定位的方法總結(jié)(動(dòng)態(tài)獲取元素)
要想操作一個(gè)元素,首先應(yīng)該識(shí)別這個(gè)元素,人有各種的特征(屬性),可以通過(guò)其特征找到人,同理,界面的某個(gè)元素會(huì)有各種的特征(屬性),可以通過(guò)這個(gè)屬性找到這對(duì)象,本文給大家介紹了python?selenium獲取元素定位的8種方法,需要的朋友可以參考下2024-02-02
Pycharm添加虛擬解釋器報(bào)錯(cuò)問(wèn)題解決方案
這篇文章主要介紹了Pycharm添加虛擬解釋器報(bào)錯(cuò)問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
python中將正則過(guò)濾的內(nèi)容輸出寫入到文件中的實(shí)例
今天小編就為大家分享一篇python中將正則過(guò)濾的內(nèi)容輸出寫入到文件中的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10

