当前位置: 首页 > article >正文

Android 使用Retrofit 以纯二进制文件流上传文件

一、背景

一般上传文件都是以表单形式上传文件,最近项目中涉及到非表单形式上传文件流,分为单个文件流上传、大文件分段上传,此种情景资料较少,这里记录下。

二、方案介绍

2.1 需求协议
1. 上传文件
API 端点:/service/upload
● 方法:PUT
● 请求参数:
    ○ filename:文件名(必选)
○ 请求头:
    ○ Authorization:用于身份验证的 token(必选)
    ○ X-Request-ID:请求的唯一标识符(必选)
    ○ Upload-Offset:当前上传块的偏移量(必选)
        ■ 单位:byte
    ○ Upload-Type:文件上传方式(必选)
        ■ 1 上传到相册(/storage/emulated/0/Pictures/)
        ■ 2 上传到sdcard(/sdcard/)
○ 请求体
    ○ 文件二进制数据
2.2 定义接口
格式:http://example.com/api/upload?filename=example.txt

所以应该这样定义接口:

   @PUT("/service/upload")
RequestBody): Call<ResponseBody>
   fun uploadFile(@Query("filename") filename:String,  @Body body: RequestBody):Call<ResponseBody>
2.3 定义一个RequestInterceptor 迭代器,将请求参数放到请求头中
class RequestInterceptor(val authorization:String,val requestId:String,val offset:String,val uploadType:String) : Interceptor {

    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        val requestBuilder = request.newBuilder()
   
        requestBuilder.addHeader("Authorization", authorization)
        requestBuilder.addHeader("X-Request-ID", requestId)

        if(offset.isNotEmpty()){
            requestBuilder.addHeader("Upload-Offset", offset)
        }

        if(uploadType.isNotEmpty()){
            requestBuilder.addHeader("Upload-Type", uploadType)
        }

//        requestBuilder.removeHeader("Content-Length")
//        requestBuilder.removeHeader("Content-Transfer-Encoding")
//        requestBuilder.removeHeader("Content-Disposition")

        return chain.proceed(requestBuilder.build())
    }
}

2.4调用接口
      // 创建文件名请求体
            val requestBody = RequestBody.create(null, file)//第一个参数传null

            val call = RetrofitClient.getUploadFileService(token, requestId, "0", uploadType)
                .uploadFile(file.name, requestBody)

 

用到的相关库:

   implementation 'com.squareup.retrofit2:retrofit:2.9.0'
   implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
   implementation 'com.squareup.okhttp3:logging-interceptor:3.14.9'


http://www.kler.cn/a/404376.html

相关文章:

  • uniapp开发微信小程序笔记3-全局配置、导航栏配置、tabBar配置
  • 【AIGC】如何使用高价值提示词Prompt提升ChatGPT响应质量
  • 好用的js组件库
  • 深入解析生成对抗网络(GAN)
  • 上海市计算机学会竞赛平台2022年8月月赛丙组屏幕比例
  • Elastic 和 Red Hat:加速公共部门 AI 和机器学习计划
  • 微信小程序登录注册页面设计(小程序项目)
  • 【python】Python 虚拟环境的常用命令
  • 基于Multisim的汽车尾灯控制电路设计与仿真
  • 01-spring security认证笔记
  • 鸿蒙UI开发与部分布局
  • 城电科技|太阳能智能座椅对零碳园区建设有什么意义?
  • Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化
  • oracle数据恢复—通过拼接数据库碎片的方式恢复Oracle数据的案例
  • Qt在designer设计师界面使用QSplitter
  • 如何配置多個子功能變數名稱共用同一IP地址?
  • ubuntu dpkg 删除安装包
  • Kafka 消费者全面解析:原理、消费者 API 与Offset 位移
  • Xcode 项目内 OC 混编 Python,调用 Python 函数,并获取返回值(基于 python 的 c函数库)
  • 鸿蒙NEXT开发案例:血型遗传计算
  • SpringBoot开发——Jar 包加密防止反编译
  • 高校节能降耗系统解决方案
  • 使用Notepad++工具去除重复行
  • Vue实战案例:一步步构建企业级项目1
  • Ansys Mechanical 中的 Step 函数在哪里?
  • 【代码随想录】贪心