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

时间: 2017-07-26

springboot配置内存数据库H2教程详解

业务背景:因soa系统要供外网访问,处于安全考虑用springboot做了个前置模块,用来转发外网调用的请求和soa返回的应答.其中外网的请求接口地址在DB2数据库中对应专门的一张表来维护,要是springboot直接访问数据库,还要专门申请权限等,比较麻烦,而一张表用内置的H2数据库维护也比较简单,就可以作为替代的办法. 环境:springboot+maven3.3+jdk1.7 1.springboot的Maven工程结构 说明一下,resource下的templates文件夹没啥用.我忘记

SpringBoot集成Swagger2实现Restful(类型转换错误解决办法)

pom.xml增加依赖包 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.2.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <

springboot springmvc抛出全局异常的解决方法

springboot中抛出异常,springboot自带的是springmvc框架,这个就不多说了. springmvc统一异常解决方法这里要说明的是.只是结合了springboot的使用而已.直接上代码,有效有用的才是ok. 1.定义异常捕获 package com.example.rest.error; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.Exce

springboot项目打成war包部署到tomcat遇到的一些问题

开发环境使用jdk1.8.0_60,把springboot 项目打成war包后, 部署到apache-tomcat-7.0.68时报错如下,换成apache-tomcat-8.0.9解决 org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/my-springboot-web-0.0.1

SpringBoot配置发送Email的示例代码

本文介绍了SpringBoot配置发送Email,分享给大家,具体如下: 引入依赖 在 pom.xml 文件中引入邮件配置: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 配置文件 # JavaMailSender 邮件发送的配置 sprin

SpringBoot静态资源css,js,img配置方案

一.概述 springboot 默认静态资源访问的路径为:/static 或 /public 或 /resources 或 /META-INF/resources 这样的地址都必须定义在src/main/resources目录文件中,这样可以达到在项目启动时候可以自动加载为项目静态地址目录到classpath下 ,静态访问地址其实是使用 ResourceHttpRequestHandler 核心处理器加载到WebMvcConfigurerAdapter进行对addResourceHandlers

springboot数据库操作图文教程

4.1 Spring-Data-Jpa Spring-Data-Jpa定义了一系列对象持久化的标准. 目前实现这一规范的产品有Hibernate. Application.yml的配置 Spring.jpa.hibernate.ddl-auto:常用属性有2个,create和Update Create:自动创建一个表,会删除掉数据库原来的数据 Update:不会删除掉数据库里原来的数据. 4.2 数据库映射类 @Entity注解 类的属性会映射到数据库的表. @Id,为主键标识 @Generat

Idea使用插件实现逆向工程搭建SpringBoot项目的图文教程

之前写SpringBoot项目,每次都要手动去写实体类.dao层啥的,尤其是数据库表字段特别多的时候,特别麻烦.然后很多小伙伴都会用逆向工程来自动生成这些类,省去许多没必要的代码量,但是Mybatis的逆向工程依然需要配置,导逆向工程的jar啊,还有编写generatorConfig.xml文件啊(有兴趣的朋友可以看看这篇博客).今天逛gitee的时候,看到了一款可以免去许多配置的idea逆向工程插件,几个步骤简单使用一下 这个插件. 1.下载并安装EasyCode插件 Setting->Plu

Mysql5.7.14安装配置方法操作图文教程(密码问题解决办法)

本篇文章主要涉及mysql5.7.14用以往的安装方法安装存在的密码登录不上,密码失效等问题的解决办法,希望可以帮到有同样困扰的朋友. 具体过程如下: 一.软件下载: 1.通过http://dev.mysql.com/downloads/mysql/下载mysql5.7.14. 2.将下载的文件进行减压,作者的减压目录是:D:\Program Files (x86)\MySQL-5.7.14-winx64. 二.安装前准备工作: 1.配置环境变量,将D:\Program Files (x86)\

ubuntu 14.04 oracle 11g 64位数据库安装图文教程

一.环境 系统:Ubuntu 14.04.5 LTS(为了贴近生产我装了个Ubuntu14的服务器版本) JDK:jdk-8u121-linux-x64.tar.gz Oracle:linux.x64_11gR2_database_1of2.ziplinux.x64_11gR2_database_2of2.zip 工具:Xshell5. 注:以上软件或者工具自行去相关官网下载 二.安装JDK 解压JDK tar -zxvf jdk-8u121-linux-x64.tar.gz 注:tools这个

Intellij IDEA创建spring-boot项目的图文教程

开发环境: jdk版本:JDK8 maven版本:maven-3.5.2 开发工具:Itellij IDEA 2017.1 前提条件:已安装以上软件并配置好jdk和maven的环境变量 创建步骤: 点击坐上角file --->选择new --->点击project... 如下图所示: 点击左边Spring Initializr ---> 右上角新建jdk(若有则不需要) ---> 点击next 如下图所示: 看需求修改下图中的信息后点击next(可以直接使用默认) 点击左边的Web

SQL Server 2005恢复数据库详细图文教程

不少需要用到sql2005的程序,有很多新手还是会操作,这里写个详细的图文教程送个菜鸟们,高手请飘过.适用于独立主机的朋友使用,如果你还没安装,请按照这个教程来安装 SQL Server 2005图文安装教程,超详细 下面是SQL Server 2005恢复数据库的详细过程 1:打开SQL Server Management Studio并登录,这个一般在开始--程序里面找到 2:鼠标右键单击数据库--新建数据库 3:弹出来的框里,填写数据库名称,我这里填写的是sqlqtdy,这个根据自己需求来

Ubuntu下mysql安装和操作图文教程

ubuntu上安装mysql非常简单只需要几条命令就可以完成. 1. sudo apt-get install mysql-server 2. apt-get isntall mysql-client 3.  sudo apt-get install libmysqlclient-dev 安装过程中会提示设置密码什么的,注意设置了不要忘了,安装完成之后可以使用如下命令来检查是否安装成功: sudo netstat -tap | grep mysql 通过上述命令检查之后,如果看到有mysql 的

sql 数据库还原图文教程

第一步:安装SQL200,并启动SQL2000. 到网上下载SQL2000,并安装完毕.(我操作系统是XP,装的是SQL个人版),按照下面所示的图片打开SQL服务管理器 点开始/继续左边的小图标启动SQL,刷新服务后就可以看到SQL启动了. 第二步:创建新的数据库,并还原数据库 打开SQL的企业管理器,如下图. 展开数据库,在上面右击数据库,新建一个数据库,弹出数据库属性对话框,名称这里我们填入www.wangyeba.com,如下图 打开数据库文件选项卡,将位置里面的路径复制好(从开头一直复制

SQLServer2005与SQLServer2008数据库同步图文教程

1,复制简介 简单的说,复制是获取一个或多个数据库的过程,它系统的针对出入不同数据库的数据,提供基于规则的拷贝机制. 复制分为三种角色, 1,发布服务器 发布服务器可以被看成是源数据库. 2 ,分发服务器 分发数据库针对更改而承担类似某些票据交换所的工作,他是一个特殊的分发数据库,用于对更改进行跟踪,同时也跟踪哪些订阅服务器已经收到了这些更改.除此之外,它还跟踪任何同步过程的结果,并知道发生了哪些必须解决的冲突. 3,订阅服务器 任何参与到于复制发布过程的数据库,订阅服务器并不只能接受数据,它还

如何远程连接SQL Server数据库的图文教程

一.设置客户端网络实用工具 点击"开始"-"程序",在"Microsoft SQL Server"菜单中选择"客户端网络实用工具". 在"别名"选项中点击"添加". 在"服务器别名"中,填入您网站域名,在"网络库"区域中点击"TCP/IP",在"连接参数"区域取消"动态决定端口",指定&q