解决springboot 获取form

网友投稿 363 2023-04-24


解决springboot 获取form

解决springboot 获取form-data里的file文件的问题

前言:

这两天用 springboot 和同事的 iOS 客户端上传文ImxBNObJQO件对接。在客户端他使用的是 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....."部分。而在普通的文本输http://入框对应的 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 parts = request.getParts();

this.multipartParameterNames = new LinkedHashSet(parts.size());

MultiValueMap files = new LinkedMultiValueMap(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 Standardhttp://MultipartFile(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文件的实例详解,如有疑问请留言或到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:VUE axios上传图片到七牛的实例代码
下一篇:解决Vue2.0自带浏览器里无法打开的原因(兼容处理)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~