解決springboot 獲取form-data里的file文件的問題
解決springboot 獲取form-data里的file文件的問題
前言:
這兩天用 springboot 和同事的 iOS 客戶端上傳文件對(duì)接。在客戶端他使用的是 afnetworking 第三方庫。我使用的是 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)行測試的時(shí)候發(fā)現(xiàn)文件上傳的部分是缺少這段值的.
我們再來看StandardMultipartHttpServletRequest的一部分源碼:
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)文章
Spring?Boot中@Autowired注入為空的原因以及解決方法
最近在開發(fā)中遇到了使用@Autowired注解自動(dòng)裝配時(shí)會(huì)報(bào)空指針,發(fā)現(xiàn)對(duì)象并沒有裝配進(jìn)來,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot中@Autowired注入為空的原因以及解決方法,需要的朋友可以參考下2024-01-01SpringBoot實(shí)現(xiàn)RabbitMQ監(jiān)聽消息的四種方式
本文主要介紹了SpringBoot實(shí)現(xiàn)RabbitMQ監(jiān)聽消息的四種方式,包括@RabbitListener,MessageListener接口,MessageListenerAdapter適配器,@RabbitHandler這幾種,感興趣的可以了解一下2024-05-05關(guān)于bootstrap.yml和bootstrap.properties的優(yōu)先級(jí)問題
這篇文章主要介紹了關(guān)于bootstrap.yml和bootstrap.properties的優(yōu)先級(jí)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Java數(shù)據(jù)結(jié)構(gòu)貪心算法的實(shí)現(xiàn)
本文主要介紹了Java數(shù)據(jù)結(jié)構(gòu)貪心算法的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2007-03-03SpringBoot整合Web開發(fā)之Json數(shù)據(jù)返回的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot整合Web開發(fā)其中Json數(shù)據(jù)返回的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08java多線程實(shí)現(xiàn)同步鎖賣票實(shí)戰(zhàn)項(xiàng)目
本文主要介紹了java多線程實(shí)現(xiàn)同步鎖賣票實(shí)戰(zhàn)項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01java web項(xiàng)目實(shí)現(xiàn)文件下載實(shí)例代碼
現(xiàn)在項(xiàng)目里面有個(gè)需求,需要把系統(tǒng)產(chǎn)生的日志文件給下載到本地 先獲取所有的日志文件列表,顯示到界面,選擇一個(gè)日志文件,把文件名傳到后臺(tái)2013-09-09