欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-19 14:43:28
解决springboot 获取form-data里的file文件的问题 前言: 这两天用 springboot 和同事的 ios 客户端上传文件对接。在客户端他使用的是...

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

前言:

这两天用 springboot 和同事的 ios 客户端上传文件对接。在客户端他使用的是 afnetworking 第三方库。我使用的是 springboot 集成的 standardmultiparthttpservletrequest 的解析方式。 写好服务器端的接口以后,使用 postman 模拟 form-data 混合上传普通文本数据和 file 文件是没问题的。后来再 ios 端混合上传文本和 file 的时候,发现 multipartfile 解析不到文件。经过查看 standardmultiparthttpservletrequest 的源文件,以及断点跟踪,发现在 form-data 解析成 part 的时候是没问题的,在遍历 part 的时候就发现问题的所在了。

下图是 postman 模拟上传时候的断点跟踪:

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

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

上一篇:

下一篇: