解决springboot 获取form-data里的file文件的问题
解决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文件的实例详解,如有疑问请留言或到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章:
- springboot 获取form-data里的 file 文件小结
- FormData解决ajax上传文件的问题及ajax跨域
- 添加文件【COCOS2DX-LUA 脚本开发之十三】解决lua项目编译Android出现get data from file failed、Cocos2dxActivity cannot be 路径等问题
- ajax利用FormData、FileReader实现多文件上传php获取
- spring-boot上传文件MultiPartFile获取不到文件问题解决
- springMvc 完美解决 multipart/form-data 方式提交请求 在 Filter 中 ServletRequest.getParameter方法 获取不到参数的问题
- 表单包含file上传文件提交,使用ajaxSubmint或者ajaxForm 遇到的问题以及解决方法
- 在tp3.2.3中使用 FormData 对象实现表单的文件上传功能遇到的一个问题及解决方法
- spring-boot上传文件MultiPartFile获取不到文件问题解决
- 简单解决 multipart/form-data 文件上传表单中 传递参数无法获取的办法! (解决办法:动态更改表单提交URL)
- JSP学习笔记:用multipart/form-data提交表单get非文件字段获取的解决办法
- C#.Net中解决PictureBox控件用FormFile方法后文件被锁定的问题
- 关于form表单提交文件file后台controller中参数获取不到的解决办法
- 解决ajaxfileupload上传文件在IE浏览器返回data为空问题
- springMvc 完美解决 multipart/form-data 方式提交请求 在 Filter 中 ServletRequest.getParameter方法 获取不到参数的问题
- 解决"利用Html5的FileRead接口和Formdata上传文件到appweb服务器"报500(internal server error)错误
- springMvc 完美解决 multipart/form-data 方式提交请求 在 Filter 中 ServletRequest.getParameter方法 获取不到参数的问题
- 解决<s:file>上传文件大小和 不能获取文件问题
- enctype="multipart/form-data" 文件上传,获取form 表单参数的问题
- struts中post方式上传文件,enctype="multipart/form-data",request.getParameter("file") 是null的问题分析