解決springboot 獲取form-data里的file文件的問題
解決springboot 獲取form-data里的file文件的問題
前言:
這兩天用 springboot 和同事的 iOS 客戶端上傳文件對(duì)接。在客戶端他使用的是 afnetworking 第三方庫(kù)。我使用的是 springboot 集成的 StandardMultipartHttpServletRequest 的解析方式。 寫好服務(wù)器端的接口以后,使用 postman 模擬 form-data 混合上傳普通文本數(shù)據(jù)和 file 文件是沒問題的。后來再 iOS 端混合上傳文本和 file 的時(shí)候,發(fā)現(xiàn) multiPartFile 解析不到文件。經(jīng)過查看 StandardMultipartHttpServletRequest 的源文件,以及斷點(diǎn)跟蹤,發(fā)現(xiàn)在 form-data 解析成 part 的時(shí)候是沒問題的,在遍歷 part 的時(shí)候就發(fā)現(xiàn)問題的所在了。
下圖是 postman 模擬上傳時(shí)候的斷點(diǎn)跟蹤:

postman模擬上傳 在途中的紅框里可以發(fā)現(xiàn)在 files 這個(gè) part 里面的 content-dispostion 這個(gè) key 對(duì)應(yīng)的 value 里面包含filename="Jitu....."部分。而在普通的文本輸入框?qū)?yīng)的 part 部分是沒這段值的。 我用 iOS 客戶端進(jìn)行測(cè)試的時(shí)候發(fā)現(xiàn)文件上傳的部分是缺少這段值的.
我們?cè)賮砜碨tandardMultipartHttpServletRequest的一部分源碼:
private static final String CONTENT_DISPOSITION = "content-disposition";
private static final String FILENAME_KEY = "filename=";
private static final String FILENAME_WITH_CHARSET_KEY = "filename*=";
private void parseRequest(HttpServletRequest request) {
try {
Collection<Part> parts = request.getParts();
this.multipartParameterNames = new LinkedHashSet<String>(parts.size());
MultiValueMap<String, MultipartFile> files = new LinkedMultiValueMap<String, MultipartFile>(parts.size());
for (Part part : parts) {
String disposition = part.getHeader(CONTENT_DISPOSITION);
String filename = extractFilename(disposition);
if (filename == null) {
filename = extractFilenameWithCharset(disposition);
}
if (filename != null) {
files.add(part.getName(), new StandardMultipartFile(part, filename));
} else {
this.multipartParameterNames.add(part.getName());
}
}
setMultipartFiles(files);
}
catch (Throwable ex) {
throw new MultipartException("Could not parse multipart servlet request", ex);
}
}
private String extractFilename(String contentDisposition) {
return extractFilename(contentDisposition, FILENAME_KEY);
}
第一個(gè)方法是解析 request 請(qǐng)求的, 作用是將 request 里面的form-data表單數(shù)據(jù)分類解析為普通文本輸入和文件輸入, 而第二個(gè)方法就是用來判斷是否為文件的, 其中第二個(gè)參數(shù)值就是filename=, 如果content-dispostion的值里包含這個(gè)值, 則判斷為文件, 否則就是普通文本輸入. 看到這里就能明白為什么在跟 iOS 客戶端聯(lián)調(diào)的時(shí)候沒把文件流解析成multipartFile. 這時(shí)候只需要在客戶端組裝form-data的時(shí)候需要加上filename=xxx這部分值.
以上就是springboot 獲取form-data里的file文件的實(shí)例詳解,如有疑問請(qǐng)留言或到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
SpringCloud Ribbon負(fù)載均衡工具使用
Ribbon是Netflix的組件之一,負(fù)責(zé)注冊(cè)中心的負(fù)載均衡,有助于控制HTTP和TCP客戶端行為。Spring?Cloud?Netflix?Ribbon一般配合Ribbon進(jìn)行使用,利用在Eureka中讀取的服務(wù)信息,在調(diào)用服務(wù)節(jié)點(diǎn)時(shí)合理進(jìn)行負(fù)載2023-02-02
java設(shè)計(jì)模式之適配器模式(Adapter)
這篇文章主要介紹了java設(shè)計(jì)模式之適配器模式Adapter的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
java對(duì)象轉(zhuǎn)化成String類型的四種方法小結(jié)
在java項(xiàng)目的實(shí)際開發(fā)和應(yīng)用中,常常需要用到將對(duì)象轉(zhuǎn)為String這一基本功能。本文就詳細(xì)的介紹幾種方法,感興趣的可以了解一下2021-08-08
詳述IntelliJ IDEA 中自動(dòng)生成 serialVersionUID 的方法(圖文)
本篇文章主要介紹了詳述IntelliJ IDEA 中自動(dòng)生成 serialVersionUID 的方法(圖文),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-11-11
springboot獲取properties屬性值的多種方式總結(jié)
這篇文章主要介紹了springboot獲取properties屬性值的多種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java Lambda表達(dá)式的方法引用和構(gòu)造器引用實(shí)例分析
這篇文章主要介紹了Java Lambda表達(dá)式的方法引用和構(gòu)造器引用,結(jié)合實(shí)例形式分析了Lambda表達(dá)式的方法引用和構(gòu)造器引用相關(guān)原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2019-09-09
Java最簡(jiǎn)單的DES加密算法實(shí)現(xiàn)案例
下面小編就為大家?guī)硪黄狫ava最簡(jiǎn)單的DES加密算法實(shí)現(xiàn)案例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
springboot 用監(jiān)聽器統(tǒng)計(jì)在線人數(shù)案例分析
這篇文章主要介紹了springboot 用監(jiān)聽器統(tǒng)計(jì)在線人數(shù)案例分析,質(zhì)是統(tǒng)計(jì)session 的數(shù)量,思路很簡(jiǎn)單,具體實(shí)例代碼大家參考下本文2018-02-02

