关于文件上传MultipartBody的使用方法

网友投稿 348 2022-07-25


目录文件上传MultipartBody的使用下面给出核心的代码,然后分析一下MultipartBody取出key,value数据,打印参数

文件上传MultipartBody的使用

最近有使用一个文件上传的功能,需要在请求中添加文件,一起传给服务器

Okhttp提供了这个文件添加然后上传的功能

下面给出核心的代码,然后分析一下

//多个文件上传,Filelist

private static Request getFilesRequest(String url, List files, Map maps){

MultipartBody.Builder builder= new MultipartBody.Builder().setType(MultipartBody.FORM);

if(maps==null){

for(int i = 0;i < files.size();i++){

builder.addPart( Headers.of("Content-Disposition", "form-data; name=\"file\";filehttp://name=\"file.jpg\""),

RequestBody.create(MediaType.parse("image/png"),files.get(i))

).build();

}

}else{

for (String key : maps.keySet()) {

String str = maps.get(key);

builder.addFormDataPart(key,str );

}

for(int j = 0;j < files.size();j++){

long fileSize = files.get(j).length();

builder.addPart( Headers.of("Content-Disposition", "form-data; name=\"file\";filename=\"file.jpg\";filesize="+fileSize),

RequestBody.create(MediaType.parse("image/png"),files.get(j))

);

}

}

RequestBody body=builder.build();

return new Request.Builder().url(url).post(body).build();

}

先说三个参数吧

三个参数第一个是请求的URL第二个是Multipart的文件list第三个是headermap,就是请求的请求头params

首先通过Multipart的Builder模式实例化一个builder

其次如果Header的map为空则直接将file加入到part中

否则依次将headermap 和 file的list中的数据加入到Request中

完成后builder build 出来的MultipartBody 请求赋值给 RequestBody(Multipartbody继承了Requestbody)

之后将Request构建完成即可

Call call =mOkhttpClient.newCall(request);

然后就是用Okhttp 进行请求,请求方法略过

MultipartBody取出key,value数据,打印参数

MultipartBody打印参数比较麻烦

kotlin:

if (requestBody is MultipartBody) {

val params = mutableMapOf()

val files = mutableMapOf()

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")

}

java写法

if (requestBody instanceof MultipartBody) {

MultipartBody body = (MultipartBody) requestBody;

Map params = new HashMap<>();

Map 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();

body.writeTo(buffer);

value = buffer.readUtf8();

params.put(key, value);

}

} else if (split.length == 3) {

//文件

String fileKey = "";

String fileName = "";

String[] keys = split[1].split("=");

http:// 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);

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Springboot详解实现食品仓库管理系统流程
下一篇:最新hadoop安装教程及hadoop的命令使用(亲测可用)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~