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

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

MultipartFile是一個接口,因此轉(zhuǎn)成MultipartFile格式需要轉(zhuǎn)成實現(xiàn)MultipartFile接口的實現(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 測試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)的實現(xiàn)的文章就介紹到這了,更多相關(guān)Java MultipartFile與File互轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你怎么用Python處理excel實現(xiàn)自動化辦公
這篇文章主要介紹了教你怎么用Python處理excel實現(xiàn)自動化辦公,文中有非常詳細的代碼示例,對正在學習python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
Pycharm+django2.2+python3.6+MySQL實現(xiàn)簡單的考試報名系統(tǒng)
這篇文章主要介紹了Pycharm+django2.2+python3.6+MySQL實現(xiàn)簡單的考試報名系統(tǒng),本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09
selenium獲取元素定位的方法總結(jié)(動態(tài)獲取元素)
要想操作一個元素,首先應該識別這個元素,人有各種的特征(屬性),可以通過其特征找到人,同理,界面的某個元素會有各種的特征(屬性),可以通過這個屬性找到這對象,本文給大家介紹了python?selenium獲取元素定位的8種方法,需要的朋友可以參考下2024-02-02
python中將正則過濾的內(nèi)容輸出寫入到文件中的實例
今天小編就為大家分享一篇python中將正則過濾的內(nèi)容輸出寫入到文件中的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10

