Android基于OkHttp實(shí)現(xiàn)文件上傳功能
本文實(shí)例為大家分享了Android基于OkHttp實(shí)現(xiàn)文件上傳的具體代碼,供大家參考,具體內(nèi)容如下
一、相關(guān)概述
- Android請(qǐng)求訪問(wèn)服務(wù)端大多數(shù)情況下依舊是使用http協(xié)議,故而可以參照web端的數(shù)據(jù)傳輸形式來(lái)實(shí)現(xiàn)。
- multipart/form-data是瀏覽器提交表單上傳文件的一種方式。
- 有關(guān)于http的get,post請(qǐng)求大家可以自行百度了解。
- OkHttp是一款優(yōu)秀的HTTP框架,它支持get請(qǐng)求和post請(qǐng)求,支持基于Http的文件上傳和下載,支持加載圖片,支持下載文件透明的GZIP壓縮,支持響應(yīng)緩存避免重復(fù)的網(wǎng)絡(luò)請(qǐng)求,支持使用連接池來(lái)降低響應(yīng)延遲問(wèn)題。
二、簡(jiǎn)單使用
1:添加依賴
implementation 'com.squareup.okhttp3:okhttp:3.10.0' implementation 'com.squareup.okio:okio:1.12.0'
2:編寫(xiě)UploadUtil類
package com.example.clientapplication.utils; ? import java.io.File; import java.io.IOException; import java.util.UUID; ? import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import okhttp3.ResponseBody; ? public class UploadUtil { ? ? private OkHttpClient okHttpClient; ? ? private UploadUtil(){ ? ? ? ? okHttpClient = new OkHttpClient(); ? ? } ? ? /** ? ? ?* 使用靜態(tài)內(nèi)部類的方式實(shí)現(xiàn)單例模式 ? ? ?*/ ? ? private static class UploadUtilInstance{ ? ? ? ? private static final UploadUtil INSTANCE = new UploadUtil(); ? ? } ? ? public static UploadUtil getInstance(){ ? ? ? ? return UploadUtilInstance.INSTANCE; ? ? } ? ? ? /** ? ? ?* @param url ? 服務(wù)器地址 ? ? ?* @param file ?所要上傳的文件 ? ? ?* @return ? ? ?響應(yīng)結(jié)果 ? ? ?* @throws IOException ? ? ?*/ ? ? public ResponseBody upload(String url, File file) throws IOException { ? ? ? ? OkHttpClient client = new OkHttpClient(); ? ? ? ? RequestBody requestBody = new MultipartBody.Builder() ? ? ? ? ? ? ? ? .setType(MultipartBody.FORM) ? ? ? ? ? ? ? ? .addFormDataPart("file", file.getName(), ? ? ? ? ? ? ? ? ? ? ? ? RequestBody.create(MediaType.parse("multipart/form-data"), file)) ? ? ? ? ? ? ? ? .build(); ? ? ? ? Request request = new Request.Builder() ? ? ? ? ? ? ? ? .header("Authorization", "ClientID" + UUID.randomUUID()) ? ? ? ? ? ? ? ? .url(url) ? ? ? ? ? ? ? ? .post(requestBody) ? ? ? ? ? ? ? ? .build(); ? ? ? ? Response response = client.newCall(request).execute(); ? ? ? ? if (!response.isSuccessful()) ? ? ? ? ? ? throw new IOException("Unexpected code " + response); ? ? ? ? return response.body(); ? ? } }
3:使用Util完成文件上傳
/** ? ? ?* 創(chuàng)建線程實(shí)現(xiàn)文件的上傳 ? ? ?* @param view ? ? ?*/ ? ? public void upload(View view){ ? ? ? ? new Thread(new Runnable() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public void run() { ? ? ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? ? ? UploadUtil.getInstance().upload(path,file); ? ? ? ? ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? }).start(); ? ? }
三、注意事項(xiàng)
在文件上傳時(shí)我用的是利用Intent獲取所選文件的Uri,使用了大佬的RealPathFromUriUtils工具類,get到文件的path,然后實(shí)例化了File作為參數(shù)使用upload方法。
在定義UploadUtil時(shí)我使用了單例模式,在保證線程安全的前提下節(jié)省資源,提升服務(wù)器訪問(wèn)速率。覺(jué)得麻煩的可以不使用單例。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- OkHttp攔截器在Android網(wǎng)絡(luò)中的使用和工作原理
- Android入門之使用OKHttp多線程下載文件
- Android 使用 okhttp3和retrofit2 進(jìn)行單文件和多文件上傳
- Android使用OKhttp3實(shí)現(xiàn)登錄注冊(cè)功能+springboot搭建后端的詳細(xì)過(guò)程
- Android的簡(jiǎn)單前后端交互(okHttp+springboot+mysql)
- Android Okhttp斷點(diǎn)續(xù)傳面試深入解析
- Android使用OkHttp發(fā)送post請(qǐng)求
- Android使用OkHttp進(jìn)行網(wǎng)絡(luò)同步異步操作
- Android視頻/音頻緩存框架AndroidVideoCache(Okhttp)詳解
- Android OkHttp實(shí)現(xiàn)全局過(guò)期token自動(dòng)刷新示例
- OkHttp原理分析小結(jié)
相關(guān)文章
詳解Android中Fragment的兩種創(chuàng)建方式
本篇文章主要介紹了Android中Fragment的兩種創(chuàng)建方式,具有一定的參考價(jià)值,有興趣的可以了解一下。2016-12-12Android實(shí)現(xiàn)自定義View控件的流程詳解
這篇文章主要為大家詳細(xì)介紹了Android中實(shí)現(xiàn)自定義View控件的流程,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-06-06Android快速實(shí)現(xiàn)觸摸移動(dòng)的懸浮窗
這篇文章主要為大家詳細(xì)介紹了Android快速實(shí)現(xiàn)觸摸移動(dòng)的懸浮窗,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Android實(shí)現(xiàn)ListView數(shù)據(jù)動(dòng)態(tài)加載的方法
這篇文章主要介紹了Android實(shí)現(xiàn)ListView數(shù)據(jù)動(dòng)態(tài)加載的方法,通過(guò)ListView控件綁定setOnScrollListener方法簡(jiǎn)單實(shí)現(xiàn)動(dòng)態(tài)加載數(shù)據(jù)的功能,需要的朋友可以參考下2016-01-01Android 去掉自定義dialog的白色邊框的簡(jiǎn)單方法
這篇文章介紹了Android 去掉自定義dialog的白色邊框,有需要的朋友可以參考一下2013-09-09Android項(xiàng)目實(shí)戰(zhàn)教程之高仿網(wǎng)易云音樂(lè)啟動(dòng)頁(yè)實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于Android項(xiàng)目實(shí)戰(zhàn)教程之高仿網(wǎng)易云音樂(lè)啟動(dòng)頁(yè)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09Android實(shí)現(xiàn)字母導(dǎo)航控件的示例代碼
這篇文章主要介紹了通過(guò)自定義View實(shí)現(xiàn)字母導(dǎo)航控件的示例代碼,文中的實(shí)現(xiàn)過(guò)程講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的可以學(xué)習(xí)一下2022-01-01