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

发布时间 - 2026-01-11 02:33:27    点击率:

解决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文件的方法  # form-data  # 用SpringBoot框架来接收multipart/form-data文件方式  # SpringBoot处理form-data表单接收对象数组的方法  # SpringBoot接收form-data和x-www-form-urlencoded数据的方法  # 客户端  # 的是  # 上传  # 这段  # 第二个  # 第一个  # 就能  # 如有  # 遍历  # 只需  # 而在  # 要在  # 这部  # 我用  # 希望能  # 再来  # 谢谢大家  # 第三方  # 这两天  # 表单 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何在Windows环境下新建FTP站点并设置权限?  如何注册花生壳免费域名并搭建个人网站?  如何快速完成中国万网建站详细流程?  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  重庆市网站制作公司,重庆招聘网站哪个好?  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  Python正则表达式进阶教程_复杂匹配与分组替换解析  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Bootstrap整体框架之JavaScript插件架构  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  如何在Windows虚拟主机上快速搭建网站?  打造顶配客厅影院,这份100寸电视推荐名单请查收  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  网页设计与网站制作内容,怎样注册网站?  Laravel如何处理CORS跨域请求?(配置示例)  潮流网站制作头像软件下载,适合母子的网名有哪些?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel怎么为数据库表字段添加索引以优化查询  Android Socket接口实现即时通讯实例代码  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  香港服务器网站推广:SEO优化与外贸独立站搭建策略  如何用AWS免费套餐快速搭建高效网站?  Swift中循环语句中的转移语句 break 和 continue  如何快速搭建高效香港服务器网站?  如何在橙子建站上传落地页?操作指南详解  如何自定义建站之星模板颜色并下载新样式?  Laravel API资源类怎么用_Laravel API Resource数据转换  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  香港服务器WordPress建站指南:SEO优化与高效部署策略  详解CentOS6.5 安装 MySQL5.1.71的方法  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  如何在局域网内绑定自建网站域名?  深圳网站制作的公司有哪些,dido官方网站?  Linux系统运维自动化项目教程_Ansible批量管理实战  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  LinuxCD持续部署教程_自动发布与回滚机制  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】