最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于文件上傳MultipartBody的使用方法

 更新時(shí)間:2022年06月09日 09:06:40   作者:Arcturis  
這篇文章主要介紹了關(guān)于文件上傳MultipartBody的使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

文件上傳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)閉

    這篇文章主要介紹了為什么mybatis中的SqlSession一定要關(guān)閉,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java基于OpenGL ES實(shí)現(xiàn)渲染實(shí)例

    java基于OpenGL ES實(shí)現(xiàn)渲染實(shí)例

    這篇文章主要介紹了java基于OpenGL ES實(shí)現(xiàn)渲染,實(shí)例分析了OpenGL渲染操作的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • Java排序算法之歸并排序簡單實(shí)現(xiàn)

    Java排序算法之歸并排序簡單實(shí)現(xiàn)

    這篇文章主要介紹了Java排序算法之歸并排序簡單實(shí)現(xiàn),具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • 淺析Java的Spring框架中IOC容器容器的應(yīng)用

    淺析Java的Spring框架中IOC容器容器的應(yīng)用

    這篇文章主要介紹了Java的Spring框架中IOC容器容器的應(yīng)用,包括BeanFactory容器和ApplicationContext容器的介紹,需要的朋友可以參考下
    2015-12-12
  • java實(shí)現(xiàn)九宮格游戲

    java實(shí)現(xiàn)九宮格游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)九宮格游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 關(guān)于Rabbitmq死信隊(duì)列及延時(shí)隊(duì)列的實(shí)現(xiàn)

    關(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
  • elasticsearch kibana簡單查詢講解

    elasticsearch kibana簡單查詢講解

    今天小編就為大家分享一篇關(guān)于elasticsearch kibana簡單查詢講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • java中Calendar類用法實(shí)例詳解

    java中Calendar類用法實(shí)例詳解

    這篇文章主要介紹了java中Calendar類用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Calendar類的函數(shù)、方法功能與相關(guān)使用技巧,需要的朋友可以參考下
    2017-10-10
  • springboot上傳圖片文件步驟詳解

    springboot上傳圖片文件步驟詳解

    這篇文章主要介紹了springboot上傳圖片文件步驟詳解,本文通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Spring Boot監(jiān)聽Redis Key失效事件實(shí)現(xiàn)定時(shí)任務(wù)的示例

    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

最新評(píng)論

榆树市| 阳高县| 宜宾市| 新昌县| 福清市| 溆浦县| 麻城市| 登封市| 盘锦市| 和静县| 瓮安县| 天津市| 遵义市| 海林市| 冕宁县| 九江县| 库尔勒市| 海原县| 孝感市| 阳原县| 盐津县| 建德市| 阳春市| 新晃| 永嘉县| 巴南区| 和田市| 松原市| 成都市| 遵义县| 共和县| 永丰县| 方城县| 南充市| 金阳县| 昌吉市| 墨竹工卡县| 海晏县| 榆林市| 资阳市| 临武县|