您好,登錄后才能下訂單哦!
解決springboot 獲取form-data里的file文件的問題
前言:
這兩天用 springboot 和同事的 iOS 客戶端上傳文件對接。在客戶端他使用的是 afnetworking 第三方庫。我使用的是 springboot 集成的 StandardMultipartHttpServletRequest 的解析方式。 寫好服務器端的接口以后,使用 postman 模擬 form-data 混合上傳普通文本數據和 file 文件是沒問題的。后來再 iOS 端混合上傳文本和 file 的時候,發現 multiPartFile 解析不到文件。經過查看 StandardMultipartHttpServletRequest 的源文件,以及斷點跟蹤,發現在 form-data 解析成 part 的時候是沒問題的,在遍歷 part 的時候就發現問題的所在了。
下圖是 postman 模擬上傳時候的斷點跟蹤:
postman模擬上傳 在途中的紅框里可以發現在 files 這個 part 里面的 content-dispostion 這個 key 對應的 value 里面包含filename="Jitu....."部分。而在普通的文本輸入框對應的 part 部分是沒這段值的。 我用 iOS 客戶端進行測試的時候發現文件上傳的部分是缺少這段值的.
我們再來看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); }
第一個方法是解析 request 請求的, 作用是將 request 里面的form-data表單數據分類解析為普通文本輸入和文件輸入, 而第二個方法就是用來判斷是否為文件的, 其中第二個參數值就是filename=, 如果content-dispostion的值里包含這個值, 則判斷為文件, 否則就是普通文本輸入. 看到這里就能明白為什么在跟 iOS 客戶端聯調的時候沒把文件流解析成multipartFile. 這時候只需要在客戶端組裝form-data的時候需要加上filename=xxx這部分值.
以上就是springboot 獲取form-data里的file文件的實例詳解,如有疑問請留言或到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。