Android 使用Retrofit 以純二進(jìn)制文件流上傳文件的操作代碼
一、背景
一般上傳文件都是以表單形式上傳文件,最近項(xiàng)目中涉及到非表單形式上傳文件流,分為單個(gè)文件流上傳、大文件分段上傳,此種情景資料較少,這里記錄下。
二、方案介紹
2.1 需求協(xié)議
1. 上傳文件
API 端點(diǎn):/service/upload
● 方法:PUT
● 請(qǐng)求參數(shù):
○ filename:文件名(必選)
○ 請(qǐng)求頭:
○ Authorization:用于身份驗(yàn)證的 token(必選)
○ X-Request-ID:請(qǐng)求的唯一標(biāo)識(shí)符(必選)
○ Upload-Offset:當(dāng)前上傳塊的偏移量(必選)
■ 單位:byte
○ Upload-Type:文件上傳方式(必選)
■ 1 上傳到相冊(cè)(/storage/emulated/0/Pictures/)
■ 2 上傳到sdcard(/sdcard/)
○ 請(qǐng)求體
○ 文件二進(jìn)制數(shù)據(jù)2.2 定義接口
格式:http://example.com/api/upload?filename=example.txt
所以應(yīng)該這樣定義接口:
@PUT("/service/upload")
RequestBody): Call<ResponseBody>
fun uploadFile(@Query("filename") filename:String, @Body body: RequestBody):Call<ResponseBody>2.3 定義一個(gè)RequestInterceptor 迭代器,將請(qǐng)求參數(shù)放到請(qǐng)求頭中
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調(diào)用接口
// 創(chuàng)建文件名請(qǐng)求體
val requestBody = RequestBody.create(null, file)//第一個(gè)參數(shù)傳null
val call = RetrofitClient.getUploadFileService(token, requestId, "0", uploadType)
.uploadFile(file.name, requestBody)用到的相關(guān)庫(kù):
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'
到此這篇關(guān)于Android 使用Retrofit 以純二進(jìn)制文件流上傳文件的文章就介紹到這了,更多相關(guān)Android 使用Retrofit 上傳文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實(shí)現(xiàn)圖片點(diǎn)擊爆炸效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片點(diǎn)擊爆炸效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
Android寫一個(gè)實(shí)時(shí)輸入框功能
這篇文章主要介紹了Android寫一個(gè)實(shí)時(shí)輸入框功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Android開發(fā)強(qiáng)制橫屏和強(qiáng)制豎屏設(shè)置實(shí)例代碼
本篇文章主要介紹了Android開發(fā)強(qiáng)制橫屏和強(qiáng)制豎屏設(shè)置實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
Android view滑動(dòng)懸浮固定效果實(shí)現(xiàn)代碼示例
本篇文章主要介紹了Android view滑動(dòng)懸浮固定效果實(shí)現(xiàn)代碼示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
Android自定義view實(shí)現(xiàn)太極效果實(shí)例代碼
這篇文章主要介紹了Android自定義view實(shí)現(xiàn)太極效果實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05
Android應(yīng)用開發(fā)中控制反轉(zhuǎn)IoC設(shè)計(jì)模式使用教程
這篇文章主要介紹了Android應(yīng)用開發(fā)中控制反轉(zhuǎn)IoC設(shè)計(jì)模式使用教程,IoC其實(shí)更常被理解為一種依賴注入的模式,用來(lái)分解業(yè)務(wù)層降低耦合,需要的朋友可以參考下2016-04-04

