最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決springboot 獲取form-data里的file文件的問題

 更新時(shí)間:2017年07月28日 15:01:38   作者:zcqshine  
這篇文章主要介紹了解決springboot 獲取form-data里的file文件的問題的相關(guān)資料,這里提供了詳細(xì)的解決步驟,需要的朋友可以參考下

解決springboot 獲取form-data里的file文件的問題

前言:

這兩天用 springboot 和同事的 iOS 客戶端上傳文件對(duì)接。在客戶端他使用的是 afnetworking 第三方庫(kù)。我使用的是 springboot 集成的 StandardMultipartHttpServletRequest 的解析方式。 寫好服務(wù)器端的接口以后,使用 postman 模擬 form-data 混合上傳普通文本數(shù)據(jù)和 file 文件是沒問題的。后來(lái)再 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è)賮?lái)看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è)方法就是用來(lái)判斷是否為文件的, 其中第二個(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)文章

最新評(píng)論

梁河县| 金寨县| 贡山| 临湘市| 武山县| 翁源县| 八宿县| 兴城市| 嵩明县| 修武县| 双城市| 秦皇岛市| 黎川县| 新乐市| 伊吾县| 镇远县| 宁阳县| 巴彦淖尔市| 镇安县| 凤台县| 女性| 余干县| 新蔡县| 司法| 丽江市| 汾西县| 凤阳县| 枣庄市| 峨眉山市| 沂水县| 钟山县| 黎平县| 田东县| 海伦市| 正阳县| 应用必备| 佛山市| 咸丰县| 科技| 西乡县| 衡南县|