關(guān)于文件上傳MultipartBody的使用方法
文件上傳MultipartBody的使用
最近有使用一個文件上傳的功能,需要在請求中添加文件,一起傳給服務(wù)器
Okhttp提供了這個文件添加然后上傳的功能
下面給出核心的代碼,然后分析一下
//多個文件上傳,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(); }
先說三個參數(shù)吧
- 三個參數(shù)第一個是請求的URL
- 第二個是Multipart的文件list
- 第三個是headermap,就是請求的請求頭params
首先通過Multipart的Builder模式實例化一個builder
其次如果Header的map為空則直接將file加入到part中
否則依次將headermap 和 file的list中的數(shù)據(jù)加入到Request中
完成后builder build 出來的MultipartBody 請求賦值給 RequestBody(Multipartbody繼承了Requestbody)
之后將Request構(gòu)建完成即可
Call call =mOkhttpClient.newCall(request);
然后就是用Okhttp 進(jìn)行請求,請求方法略過
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); }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring SpringMVC,Spring整合MyBatis 事務(wù)配置的詳細(xì)流程
這篇文章給大家介紹SSM整合詳細(xì)流程步驟 Spring SpringMVC,Spring整合MyBatis 事務(wù)配置,本文通過實例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-10-10Java項目開啟遠(yuǎn)程調(diào)試的方法步驟(tomcat、springboot)
這篇文章主要介紹了Java項目開啟遠(yuǎn)程調(diào)試的方法步驟(tomcat、springboot),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10springboot+thymeleaf 文件上傳功能的實現(xiàn)代碼
這篇文章主要介紹了springboot+thymeleaf 文件上傳功能的實現(xiàn)代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11MyBatis的注解使用、ORM層優(yōu)化方式(懶加載和緩存)
這篇文章主要介紹了MyBatis的注解使用、ORM層優(yōu)化方式(懶加載和緩存),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10Java引用傳遞實現(xiàn)方式以及與值傳遞的區(qū)別
這篇文章主要給大家介紹了關(guān)于Java引用傳遞實現(xiàn)方式以及與值傳遞的區(qū)別的相關(guān)資料,引用傳遞指在調(diào)用函數(shù)時將實際參數(shù)的地址直接傳遞到函數(shù)中,那么在函數(shù)中對參數(shù)所進(jìn)行的修改,將影響到實際參數(shù),需要的朋友可以參考下2023-09-09