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'
相关推荐
ii_best5 小时前
按键精灵支持安卓14、15系统,兼容64位环境开发辅助工具
android
美狐美颜sdk5 小时前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
恋猫de小郭9 小时前
Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持
android·开发语言·ios·kotlin
aqi0010 小时前
FFmpeg开发笔记(七十七)Android的开源音视频剪辑框架RxFFmpeg
android·ffmpeg·音视频·流媒体
androidwork12 小时前
深入解析内存抖动:定位与修复实战(Kotlin版)
android·kotlin
梦天201512 小时前
android核心技术摘要
android
szhangbiao14 小时前
“开发板”类APP如果做屏幕适配
android
高林雨露15 小时前
RecyclerView中跳转到最后一条item并确保它在可视区域内显示
android
移动开发者1号17 小时前
ReLinker优化So库加载指南
android·kotlin
山野万里__17 小时前
C++与Java内存共享技术:跨平台与跨语言实现指南
android·java·c++·笔记