關(guān)于文件上傳MultipartBody的使用方法
文件上傳MultipartBody的使用
最近有使用一個(gè)文件上傳的功能,需要在請(qǐng)求中添加文件,一起傳給服務(wù)器
Okhttp提供了這個(gè)文件添加然后上傳的功能
下面給出核心的代碼,然后分析一下
//多個(gè)文件上傳,Filelist
private static Request getFilesRequest(String url, List<File> files, Map<String, String> 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\";filename=\"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();
}先說三個(gè)參數(shù)吧
- 三個(gè)參數(shù)第一個(gè)是請(qǐng)求的URL
- 第二個(gè)是Multipart的文件list
- 第三個(gè)是headermap,就是請(qǐng)求的請(qǐng)求頭params
首先通過Multipart的Builder模式實(shí)例化一個(gè)builder
其次如果Header的map為空則直接將file加入到part中
否則依次將headermap 和 file的list中的數(shù)據(jù)加入到Request中
完成后builder build 出來的MultipartBody 請(qǐng)求賦值給 RequestBody(Multipartbody繼承了Requestbody)
之后將Request構(gòu)建完成即可
Call call =mOkhttpClient.newCall(request);
然后就是用Okhttp 進(jìn)行請(qǐng)求,請(qǐng)求方法略過
MultipartBody取出key,value數(shù)據(jù),打印參數(shù)
MultipartBody打印參數(shù)比較麻煩
kotlin:
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 -> {
//文本參數(shù)
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<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();
body.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("文本參數(shù)-->" + params);
System.out.println("文件參數(shù)-->" + files);
}以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
為什么mybatis中的SqlSession一定要關(guān)閉
這篇文章主要介紹了為什么mybatis中的SqlSession一定要關(guān)閉,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
java基于OpenGL ES實(shí)現(xiàn)渲染實(shí)例
這篇文章主要介紹了java基于OpenGL ES實(shí)現(xiàn)渲染,實(shí)例分析了OpenGL渲染操作的相關(guān)技巧,需要的朋友可以參考下2015-06-06
淺析Java的Spring框架中IOC容器容器的應(yīng)用
這篇文章主要介紹了Java的Spring框架中IOC容器容器的應(yīng)用,包括BeanFactory容器和ApplicationContext容器的介紹,需要的朋友可以參考下2015-12-12
關(guān)于Rabbitmq死信隊(duì)列及延時(shí)隊(duì)列的實(shí)現(xiàn)
這篇文章主要介紹了關(guān)于Rabbitmq死信隊(duì)列及延時(shí)隊(duì)列的實(shí)現(xiàn),TTL就是消息或者隊(duì)列的過期功能,當(dāng)消息過期就會(huì)進(jìn)到死信隊(duì)列,死信隊(duì)列和普通隊(duì)列沒啥區(qū)別,然后我們只需要配置一個(gè)消費(fèi)者來消費(fèi)死信隊(duì)列里面的消息就可以了,需要的朋友可以參考下2023-08-08
Spring Boot監(jiān)聽Redis Key失效事件實(shí)現(xiàn)定時(shí)任務(wù)的示例
這篇文章主要介紹了Spring Boot監(jiān)聽Redis Key失效事件實(shí)現(xiàn)定時(shí)任務(wù)的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

