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

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)//第一个参数传nullval 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.lryc.cn/news/487057.html

相关文章:

  • Vue3踩坑记录
  • 大数据-227 离线数仓 - Flume 自定义拦截器(续接上节) 采集启动日志和事件日志
  • 【热门主题】000054 ECMAScript:现代 Web 开发的核心语言
  • 【Pytorch】torch.nn.functional模块中的非线性激活函数
  • reactflow 中 useNodesState 模块作用
  • Go语言内存分配源码分析学习笔记
  • 【jvm】方法区常用参数有哪些
  • JAVA环境的配置
  • LLM文档对话 —— pdf解析关键问题
  • MySQL单表查询时索引使用情况
  • Qt邮箱程序改良版(信号和槽)
  • 入门到精通mysql数据(四)
  • Java 设计模式 详解
  • 卡尔曼滤波学习资料汇总
  • linux003.在ubuntu中安装cmake的方法
  • EtherNet/IP转Profinet网关连接发那科机器人配置实例解析
  • 自动化运维-检测Linux服务器CPU、内存、负载、IO读写、机房带宽和服务器类型等信息脚本
  • ubuntu24.04设置开机自启动Eureka
  • 从视频帧生成点云数据、使用PointNet++模型提取特征,并将特征保存下来的完整实现。
  • 工化企业内部能源能耗过大 落实能源管理
  • LSTM 和 LSTMCell
  • python成长技能之正则表达式
  • 解决docker报Error response from daemon Get httpsregistry-1.docker.iov2错误
  • 【论文分享】利用多源大数据衡量街道步行环境的老年友好性:以中国上海为例
  • 说说软件工程中的“协程”
  • 使用IDE实现java端远程调试功能
  • javaScript交互案例2
  • JavaScript 浏览器对象模型 BOM
  • 基于MATLAB的激光雷达与相机联合标定原理及实现方法——以标定板为例
  • React(一)