Android 使用Retrofit 以純二進(jìn)制文件流上傳文件的操作代碼
一、背景
一般上傳文件都是以表單形式上傳文件,最近項(xiàng)目中涉及到非表單形式上傳文件流,分為單個文件流上傳、大文件分段上傳,此種情景資料較少,這里記錄下。
二、方案介紹
2.1 需求協(xié)議
1. 上傳文件 API 端點(diǎn):/service/upload ● 方法:PUT ● 請求參數(shù): ○ filename:文件名(必選) ○ 請求頭: ○ Authorization:用于身份驗(yàn)證的 token(必選) ○ X-Request-ID:請求的唯一標(biāo)識符(必選) ○ Upload-Offset:當(dāng)前上傳塊的偏移量(必選) ■ 單位:byte ○ Upload-Type:文件上傳方式(必選) ■ 1 上傳到相冊(/storage/emulated/0/Pictures/) ■ 2 上傳到sdcard(/sdcard/) ○ 請求體 ○ 文件二進(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 定義一個RequestInterceptor 迭代器,將請求參數(shù)放到請求頭中
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)建文件名請求體 val requestBody = RequestBody.create(null, file)//第一個參數(shù)傳null val call = RetrofitClient.getUploadFileService(token, requestId, "0", uploadType) .uploadFile(file.name, requestBody)
用到的相關(guān)庫:
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android自定義View設(shè)定到FrameLayout布局中實(shí)現(xiàn)多組件顯示的方法 分享
Android自定義View設(shè)定到FrameLayout布局中實(shí)現(xiàn)多組件顯示的方法 分享,需要的朋友可以參考一下2013-05-05Android中SharedPreference詳解及簡單實(shí)例
這篇文章主要介紹了 Android中SharedPreference詳解及簡單實(shí)例的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09Android實(shí)現(xiàn)左側(cè)滑動菜單
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)左側(cè)滑動菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Android 啟動模式FLAG_ACTIVITY_CLEAR_TOP案例詳解
這篇文章主要介紹了Android 啟動模式FLAG_ACTIVITY_CLEAR_TOP案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Android編程實(shí)現(xiàn)通話錄音功能的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)通話錄音功能的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android廣播接收機(jī)制實(shí)現(xiàn)錄音功能的操作技巧,需要的朋友可以參考下2017-06-06Webview實(shí)現(xiàn)android簡單的瀏覽器實(shí)例代碼
這篇文章主要介紹了Webview實(shí)現(xiàn)android簡單的瀏覽器實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-02-02怎樣實(shí)現(xiàn)android http-post方法實(shí)例說明
android http-post方法在開發(fā)中如何實(shí)現(xiàn),具體代碼如下,感興趣的朋友可以參考下哈,希望對大家有所幫助2013-06-06