if (requestBody is MultipartBody) {
val params = mutableMapOf<String, String>()
val files = mutableMapOf<String, String>()
requestBody.parts().forEach {
val body = it.body()
it.headers()?.let {
val header = it.value(0)
val split = header.replace(" ", "").replace("\"", "").split(";")
when (split.size) {
2 -> {
val keys = split[1].split("=")
if (keys.size > 1 && body.contentLength() < 1024) {
val key = keys[1]
val buffer = Buffer()
body.writeTo(buffer)
val value = buffer.readUtf8()
params[key] = value
3 -> {
val fileKeys = split[1].split("=")
val fileKey = if (fileKeys.size > 1) {
fileKeys[1]
} else ""
val nameValue = split[2].split("=")
val fileName = if (nameValue.size > 1) nameValue[1] else ""
files[fileKey] = fileName
println("文件-->$files")
println("文本-->$params")
if (requestBody instanceof MultipartBody) {
MultipartBody body = (MultipartBody) requestBody;
Map<String, String> params = new HashMap<>();
Map<String, String> files = new HashMap<>();
for (MultipartBody.Part part : body.parts()) {
RequestBody body1 = part.body();
Headers headers = part.headers();
if (headers != null && headers.size() > 0) {
String[] split = headers.value(0).replace(" ", "").replace("\"", "").split(";");
if (split.length == 2) {
String[] keys = split[1].split("=");
if (keys.length > 1 && body1.contentLength() < 1024) {
String key = keys[1];
String value = "";
Buffer buffer = new Buffer();
body1.writeTo(buffer);
value = buffer.readUtf8();
params.put(key, value);
} else if (split.length == 3) {
String fileKey = "";
String fileName = "";
String[] keys = split[1].split("=");
String[] names = split[2].split("=");
if (keys.length > 1) fileKey = keys[1];
if (names.length > 1) fileName = names[1];
files.put(fileKey, fileName);
System.out.println("文本参数-->" + params);
System.out.println("文件参数-->" + files);
ContentType,也称为媒体类型或MIME类型,用于描述网络请求和响应中的内容类型。text/plain:普通文本text/html:HTML文档:JSON数据:XML数据image/jpeg:JPEG图片image/png:PNG图片:用于文件上传本文主要关注,因为它通常用于表单提交,特别是包含文件上传的表单。
Android 移动开发当中免不了要访问网络,访问网络的方式相信每个人都会有自己不同的方法,你可以自己封装网络请求,也可以用网上别人开源的框架。如果开源的框架当中,目前最受欢迎的可要数Retrofit了,而使用Retrofit中最麻烦也就是上传图片或者文件了,本文就对如何使用Retrofit同时上传多参数和多图片文件做详细的演示,并贴出相应实例代码。
在正式本文的讲解之前,先说明一下,基于现在R
使用MultipartBody上传多个文件
RequestBody.create用于接收MediaType.parse
MediaType.parse(“text/plain”) 指定文件上传的类型
Request 创建请求对象
url 参数为域名
post(multipartBody) 参数是需要上传的文件和类型
Builder 构建器
okHttpClient.newCall(request); 获取Call(准备好请求的对象) 参数是:Request 请求对象
Call 准备好请求的
在“Header”里面添加“Content-Type”好似无效一样,后台并不能接收到数据,接口一直是超时的状态,在RequestBody设置“Content-Type”才得以解决;
相信大多数人在写文件上传下载代码的时候,都不太明白MediaType的含义。这里详细列出MediaType含义。以及对应解释说明。类型描述| — | — || text/html | HTML格式 || text/plain | 纯文本格式,空格转换为 “+” 加号,不对特殊字符编码 || text/xml | XML格式 || text/x-markdown | Markdown格式 || image/gif | gif图片格式 || image/jpeg | jpg图片格式 |
@FormUrlEncoded
@POST("upload")
Call<ResponseBody> uploadParams(@Field("username")String username,@Field("token")String token);
2. 多个参数上传
@FormUrlEncoded
@POST("upload")
Call<ResponseBody> uploadParams(@FieldMap Map<String,
然后controller层的传参需要用@RequestParam或者直接一个请求的实体类,如果使用实体类,千万不要加@RequestBody,不然结合上传文件会失效,上传文件使用。有时候需要对接一些接口,而且接口传参不仅需要各种类型的参数,甚至还要上传文件,所以遇到挺多坑,用postman的生成代码也不好用,于是就有了这篇文章。@RequestPart("file") MultipartFile file进行传参。话不多说,我们直接上代码。首先是service层。