Retrofit2 使用@Multipart上传文件

2023-11-13

1、上传单个文件

1.1定义接口

 
    @Multipart
    @POST("uploadImgs")
    Call<HttpBaseResult<List<PicResultData>>> uploadSingleImg(@Part("description") RequestBody description, @Part MultipartBody.Part file);

1.2接口传参

    public void uploadImg(Object pcObj, String fileUrl) {

        File file = new File(fileUrl);
        // 创建 RequestBody,用于封装构建RequestBody
        // RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
         RequestBody requestFile = RequestBody.create(MediaType.parse("image/jpg"), file);

        // MultipartBody.Part  和后端约定好Key,这里的partName是用file
        MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile);

        // 添加描述
        String descriptionString = "hello, 这是文件描述";
        RequestBody description = RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString);

        // 执行请求
        serviceApi.uploadSingleImg(description, body).enqueue(new BaseViewModel.HttpRequestCallback<List<PicResultData>>() {

            @Override
            public void onSuccess(List<PicResultData> result) {
                super.onSuccess(result);
            }

            @Override
            public void onFailure(int status, String message) {
                super.onFailure(status, message);
            }
        });

    }

2、上传多个文件

2.1定义接口

   @Multipart
    @POST("uploadImgs")
    Call<HttpBaseResult<List<PicResultData>>> uploadMultiImgs(@PartMap Map<String, RequestBody> maps);

2.2接口传参

   public void uploadImgs(Object pcObj, List<String> imgStrs) {
        Map<String, RequestBody> map = new HashMap<>();
        for (String imgUrl : imgStrs) {
            File file = new File(imgUrl);
            // create RequestBody instance from file
            // RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
            RequestBody requestFile = RequestBody.create(MediaType.parse("image/jpg"), file);
            //注意:file就是与服务器对应的key,后面filename是服务器得到的文件名
            map.put("file\"; filename=\"" + file.getName(), requestFile);
        }

        // 执行请求
        serviceApi.uploadMultiImgs(map).enqueue(new BaseViewModel.HttpRequestCallback<List<PicResultData>>() {

            @Override
            public void onSuccess(List<PicResultData> result) {
                super.onSuccess(result);
            }

            @Override
            public void onFailure(int status, String message) {
                super.onFailure(status, message);
            }
        });
    }

3、上传图文(图文混传)

3.1定义接口

    @Multipart
    @POST("gather/vehicle")
    Call<HttpBaseResult<VehicleResponse>> uploadInfo(@Header("jwt-token") String token, @PartMap Map<String, RequestBody> files);

3.2接口传参

 private void uploadInfo(VehicleResponse response) {
        String token = SpUtil.getJwtToken(mContext);
        Map<String, RequestBody> map = new HashMap<>();
        File file = new File(response.getImgUrl());
        // map.put(String.format("file\"; filename=\"" + file.getName()), RequestBody.create(MediaType.parse("multipart/form-data"), file));
        //map.put(String.format("imageFile\"; filename=\"123456.jpg"), RequestBody.create(MediaType.parse("image/jpg"), file));//图片名称不能包含中文字符
        map.put(String.format("file\"; filename=\"" + file.getName()), RequestBody.create(MediaType.parse("image/jpg"), file));
        map.put("plateNo", toRequestBody(response.getPlateNo()));
        map.put("plateColor", toRequestBody(response.getPlateColor()));
        map.put("deviceId", toRequestBody(BizUtil.getImeiString(mContext)));
        map.put("longitude", toRequestBody(String.valueOf(response.getLongitude())));
        map.put("latitude", toRequestBody(String.valueOf(response.getLatitude())));
        map.put("address", toRequestBody(response.getAddress() + "_非空值"));
        map.put("gatherTime", toRequestBody(DateUtil.Long2String(response.getGatherTime(), "yyyy-MM-dd HH:mm:ss")));

        serviceApi.uploadInfo(token, map).enqueue(new HttpRequestCallback<VehicleResponse>() {
            @Override
            public void onSuccess(VehicleResponse result) {
                super.onSuccess(result);
            }
            @Override
            public void onFailure(int status, String message) {
                super.onFailure(status, message);
            }
        });
    }

    private RequestBody toRequestBody(String value) {
        RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), value);
        return requestBody;
    }
}

4、图文混传(使用 MultipartBody.Part)

4.1接口定义

    @Multipart
    @POST("gather/vehicle")
    Call<HttpBaseResult<VehicleResponse>> uploadInfo(@Header("jwt-token") String token, @PartMap Map<String, RequestBody> files, @Part MultipartBody.Part file);

4.2接口传参

private void uploadInfo(VehicleResponse response) {
        String token = SpUtil.getJwtToken(mContext);
        Map<String, RequestBody> map = new HashMap<>();
        File file = new File(response.getImgUrl());
        RequestBody requestFile = RequestBody.create(MediaType.parse("image/jpg"), file);
        MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile);

        map.put("plateNo", toRequestBody(response.getPlateNo()));
        map.put("plateColor", toRequestBody(response.getPlateColor()));
        map.put("deviceId", toRequestBody(BizUtil.getImeiString(mContext)));
        map.put("longitude", toRequestBody(String.valueOf(response.getLongitude())));
        map.put("latitude", toRequestBody(String.valueOf(response.getLatitude())));
        map.put("address", toRequestBody(response.getAddress() + "_非空值"));
        map.put("gatherTime", toRequestBody(DateUtil.Long2String(response.getGatherTime(), "yyyy-MM-dd HH:mm:ss")));

        serviceApi.uploadInfo(token, map, body).enqueue(new HttpRequestCallback<VehicleResponse>() {
            @Override
            public void onSuccess(VehicleResponse result) {
                super.onSuccess(result);
            }

            @Override
            public void onFailure(int status, String message) {
                super.onFailure(status, message);
            }
        });
    }

5、多文件上传(使用 List<MultipartBody.Part>)

5.1、定义接口:

 @Multipart
 @POST("yj-kecis-server/kecis/file/commonUpload/batch")
 suspend fun commonUploadFileBatch(@Part parts: List<MultipartBody.Part>): HttpBaseResult<List<HttpMultiFileResponse>>

5.2、接口传参:

 private fun uploadFiles(localFiles : List<String>) {
        val parts: MutableList<MultipartBody.Part> = mutableListOf()
        localFiles?.forEach { filePath ->
            val file = File(filePath)
            val requestBody: RequestBody = RequestBody.create(okhttp3.MediaType.parse("application/octet-stream"), file)
            val part = MultipartBody.Part.createFormData("files", file.name, requestBody)
            
            parts.add(part)//循环添加多个文件
        }
        
        //其他参数
        parts.add( MultipartBody.Part.createFormData( "moduleName", INCIDENT_ANNEX_SERVER_FOLDER) )
        
        httpLaunch(false,
            request = { HttpServicesFactory.httpApi.commonUploadFileBatch(parts) },
            onSuccess = { fileResponse -> 
            ...
            },
            onError = { msg ->
                showToast("附件上传失败$msg")
            }
        )
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Retrofit2 使用@Multipart上传文件 的相关文章

随机推荐

  • 大数据时代究竟带来了什么? ——写给普通人看的大数据文章

    数据 让一切有迹可循 让一切有源可溯 我们每天都在产生数据 创造大数据和使用大数据 只是 你 仍然浑然不知 百度知道和知乎问答里一直有小伙伴在问这个问题 比如 大数据时代 生活和思维发生了哪些变 大数据时代给我们的生活带来了哪些好处呢 以及
  • NvidiaCUDA通用计算简介及优化方法概述

    IT168 技术 1 GPU通用计算简介 注 本文为IT168 NVIDIA联合举办的 如何并行化我的应用 方案征集活动参赛作品 本次方案征集活动详情见 http cuda itpub net thread 1299715 1 1 html
  • 字节跳动《算法中文手册》火了,完整版 PDF 开放下载!

    今天给大家推荐两份来自字节跳动大佬的算法进阶指南 据说有不少小伙伴靠这份指南成功掌握了算法的核心技能 拿到了 BAT offer 希望对大家有帮助 第一份资料是 70K Star 的 labuladong 的算法小抄 作者 labulado
  • 【自我提高】树莓派GPIO的几种语言控制方法 python 篇

    使用 python 语言控制 GPIO 18 首先知道树莓派外置IO的关系对照表 我这里的树莓派是 PI 3B V1 2 关系对照表如下 首先安装 python 和 GPIO 库 具体安装过程参考 https blog csdn net w
  • DETR论文解读

    DETR基本介绍 DETR的一个创新是端到端的目标检测 它能够将目标检测看做成集合预测问题 而不需要像之前的目标检测算法需要anchor或者nms等 总之就是一个将CNN和transformer结合的一个新颖的目标检测框架 改变预测头还可以
  • Android studio 一个项目引入另一个项目作为Libary

    1 在我们开发Android项目时 有时需要一个项目作为另一个项目的工具类的引用 这样就需要配置下 使得MyLibrary到MyApplication作为一个module 我们直接截图上步骤 1 假设我们新建两个项目 一个是引入的项目 一个
  • Error: failed to create deliver client :orderer client failed to connect to orderer

    问题描述 在部署fabric时 peer create channel时报错如下 Error failed to create deliver client orderer client failed to connect to order
  • linux删除某个目录下旧文件只保留最新的10个

    find aaa bbb ccc d name mingcheng sort head n 10 xargs rm rf 指令解析 find aaa bbb ccc d 意思是 在 aaa bbb ccc查找文件夹 name mingche
  • Redis-应用问题解决

    缓存穿透 缓存穿透现象 应用服务器压力变大 redis命中率降低 一直查询数据库 原因 redis查询不到数据库 出现很多非正常url访问 解决方案 1 对空值缓存 如果一个查询返回的数据为空 不管是数据是否不存在 我们仍然把这个空结果 n
  • 【C++设计模式】详解装饰模式

    2023年8月31日 周四上午 这是我目前碰到的最难的设计模式 非常难以理解而且比较灵活多半 学得贼难受 写得贼费劲 2023年8月31日 周四晚上19 48 终于写完了 花了一天的时间来学习装饰模式和写这篇博客 虽然基本上把我今天的收获都
  • 点在多边形内的判断

    c语言代码 typedef struct tagVERTEX double x double y VERTEX 判断点与多边形关系 0 外 1 上 2 内int PointInPolygon VERTEX pt VERTEX vtx int
  • Pgsql报错:PostgreSQL的SQL语句参数上限报错

    org postgresql util PSQLException An I O error occurred while sending to the backend Caused by java io IOException Tried
  • maven 全入门

    使用SPRINGSOURCE TOOL SUITE创建maven web project 推荐使用springsource的sts 一款基于eclipse整合的ide sts下载地址 安装好m2clipse插件后 在ide菜单栏点击 win
  • mssql sqlserver 获取指定日期为本月第几个工作日

    转自 https www cnblogs com lairui1232000 p 9286104 html 摘要 下文讲述工作中 需要获取指定日期在当月的工作日 下文讲述常规的指定工作日所在月的天数分析 实现思路 1 生成一个国家法定假日表
  • C#的笔记属性索引器,委托事件,泛型集合,异常捕捉

    C 有一些与其他语言C Java不同的特性这里特别记一下 他们大部分基本的内容是相同的 C 有属性索引器 委托事件 泛型集合 trycatchfinally异常捕捉 属性Property 属性时一种很像字段的方法 他有getset访问器 使
  • 高并发高可用(二)架构

    4 大型网站架构模式 模式词汇来源于建筑学 定义 每个模式描述一个在我们周围不断重复发生发生的问题及该问题解决方案的核心 这样你就能一次又一次使用该方案而不必做重复的工作 为解决大型网站所遇到的高并发访问 海量数据处理 高可用运行等系列问题
  • MySQL的预读机制

    一 预读机制 InnoDB在I O的优化上有个比较重要的特性为预读 预读请求是一个i o请求 它会异步地在缓冲池中预先回迁多个页面 预计很快就会需要这些页面 这些请求在一个范围内引入所有页面 InnoDB以64个page为一个extent
  • 网上书店管理系统 课程设计

    数据库原理及应用 综合设计报告 第一章 绪论 随着计算机技术的发展以及计算机网络的逐渐普及 因特网成为了人们查找信息的重要场所 二十一世纪是信息的时代 所以信息的交换和信息的流通就显得特别的重要 因此网上书店的出现成为必然 实体书店在正常运
  • pytorch 入门 DenseNet

    知识点0 dense block的结构 知识点1 定义dense block 知识点2 定义DenseNet的主体 知识点3 add module 知识点 densenet是由 多个这种结构串联而成的 import torch import
  • Retrofit2 使用@Multipart上传文件

    1 上传单个文件 1 1定义接口 Multipart POST uploadImgs Call