解决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=""部分。⽽在普通的⽂本输⼊框对应的 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 = Parts();
this.multipartParameterNames = new LinkedHashSet<String>(parts.size());
MultiValueMap<String, MultipartFile> files = new LinkedMultiValueMap<String, MultipartFile>(parts.size());
for (Part part : parts) {
String disposition = Header(CONTENT_DISPOSITION);
String filename = extractFilename(disposition);
if (filename == null) {
filename = extractFilenameWithCharset(disposition);
}
if (filename != null) {
files.Name(), new StandardMultipartFile(part, filename));
} else {
this.multipartParameterNames.Name());
}
}
setMultipartFiles(files);
}
springboot其实就是spring
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⽂件的实例详解,如有疑问请留⾔或到本站社区交流讨论,感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。