java中File轉(zhuǎn)為MultipartFile的四種實(shí)現(xiàn)方式
問題背景
項(xiàng)目中需要調(diào)用別人的接口上傳一個(gè)文件,別人的接口參數(shù)為MultipartFile類型,需要對File文件進(jìn)行一個(gè)轉(zhuǎn)換再進(jìn)行上傳
File轉(zhuǎn)MultipartFile
1.方法一
public static MultipartFile getMultipartFile(File file) {
FileItem item = new DiskFileItemFactory().createItem("file"
, MediaType.MULTIPART_FORM_DATA_VALUE
, true
, file.getName());
try (InputStream input = new FileInputStream(file);
OutputStream os = item.getOutputStream()) {
// 流轉(zhuǎn)移
IOUtils.copy(input, os);
} catch (Exception e) {
throw new IllegalArgumentException("Invalid file: " + e, e);
}
return new CommonsMultipartFile(item);
}可以設(shè)置為靜態(tài)方法,也可以使用對象進(jìn)行調(diào)用
File file = new File("D:\\a.txt");
MultipartFile cMultiFile = getMultipartFile(file);2.方法二
// 第二種方式
public static MultipartFile getMultipartFile(File file) {
DiskFileItem item = new DiskFileItem("file"
, MediaType.MULTIPART_FORM_DATA_VALUE
, true
, file.getName()
, (int)file.length()
, file.getParentFile());
try {
OutputStream os = item.getOutputStream();
os.write(FileUtils.readFileToByteArray(file));
} catch (IOException e) {
e.printStackTrace();
}
return new CommonsMultipartFile(item);
}可以設(shè)置為靜態(tài)方法,也可以使用對象進(jìn)行調(diào)用
File file = new File("D:\\a.txt");
MultipartFile cMultiFile = getMultipartFile(file);3.方法三
創(chuàng)建FileItem
public static FileItem createFileItem(String filePath, String fileName){
String fieldName = "file";
FileItemFactory factory = new DiskFileItemFactory(16, null);
FileItem item = factory.createItem(fieldName, "text/plain", false,fileName);
File newfile = new File(filePath);
int bytesRead = 0;
byte[] buffer = new byte[8192];
try (FileInputStream fis = new FileInputStream(newfile);
OutputStream os = item.getOutputStream()) {
while ((bytesRead = fis.read(buffer, 0, 8192))!= -1)
{
os.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
return item;
}File file = new File("D:\\a.txt");
FileItem fileItem = createFileItem(file.getPath(),file.getName());
MultipartFile cMultiFile = new CommonsMultipartFile(fileItem);4.方法4
添加依賴
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>import org.springframework.mock.web.MockMultipartFile;
File file = new File("D:\\a.txt");
MultipartFile cMultiFile = new MockMultipartFile("file", file.getName(), null, new FileInputStream(file));5.如果傳輸有點(diǎn)問題可能傳輸?shù)念愋陀悬c(diǎn)不同
MediaType.MULTIPART_FORM_DATA_VALUE
更改為
MediaType.TEXT_PLAIN_VALUE
總結(jié)
方法有很多,自己選一種合適的
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatisPuls多數(shù)據(jù)源操作數(shù)據(jù)源偶爾報(bào)錯(cuò)問題
這篇文章主要介紹了MyBatisPuls多數(shù)據(jù)源操作數(shù)據(jù)源偶爾報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
SpringMVC如何把后臺(tái)文件打印到前臺(tái)
這篇文章主要介紹了SpringMVC如何把后臺(tái)文件打印到前臺(tái),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Java Callable接口實(shí)現(xiàn)細(xì)節(jié)詳解
這篇文章主要介紹了Java Callable接口實(shí)現(xiàn)細(xì)節(jié)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
JPA @Basic單表查詢?nèi)绾螌?shí)現(xiàn)大字段懶加載
這篇文章主要介紹了JPA @Basic單表查詢?nèi)绾螌?shí)現(xiàn)大字段懶加載的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Java for-each循環(huán)使用難題2例(高級使用方法)
從Java5起,在Java中有了for-each循環(huán),可以用來循環(huán)遍歷collection和array。For each循環(huán)允許你在無需保持傳統(tǒng)for循環(huán)中的索引,或在使用iterator /ListIterator時(shí)無需調(diào)用while循環(huán)中的hasNext()方法就能遍歷collection2014-04-04
利用SpringBoot實(shí)現(xiàn)一個(gè)基于本地代理模式的RPC調(diào)用框架
雖然Dubbo、gRPC等成熟框架已經(jīng)為我們提供了完整的RPC解決方案,但理解其底層原理并動(dòng)手實(shí)現(xiàn)一個(gè)簡化版本,對提升我們的技術(shù)理解深度很有幫助,下面我們就來看看如何使用SpringBoot實(shí)現(xiàn)一個(gè)基于本地代理模式的RPC調(diào)用框架吧2025-07-07
Java多線程Thread基礎(chǔ)學(xué)習(xí)
每一個(gè)正在執(zhí)行的程序都是一個(gè)進(jìn)程,資源只有一塊,所以在同一時(shí)間段會(huì)有多個(gè)程序同時(shí)執(zhí)行,但是在一個(gè)時(shí)間點(diǎn)上,只能由一個(gè)程序執(zhí)行,多線程是在一個(gè)進(jìn)程的基礎(chǔ)之上的進(jìn)一步劃分,需要的朋友可以參考下2023-04-04

