日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Android基于OkHttp實現文件上傳功能_Android

作者:凌風.983 ? 更新時間: 2022-09-19 編程語言

本文實例為大家分享了Android基于OkHttp實現文件上傳的具體代碼,供大家參考,具體內容如下

一、相關概述

  • Android請求訪問服務端大多數情況下依舊是使用http協議,故而可以參照web端的數據傳輸形式來實現。
  • multipart/form-data是瀏覽器提交表單上傳文件的一種方式。
  • 有關于http的get,post請求大家可以自行百度了解。
  • OkHttp是一款優秀的HTTP框架,它支持get請求和post請求,支持基于Http的文件上傳和下載,支持加載圖片,支持下載文件透明的GZIP壓縮,支持響應緩存避免重復的網絡請求,支持使用連接池來降低響應延遲問題。

二、簡單使用

1:添加依賴

implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.squareup.okio:okio:1.12.0'

2:編寫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();
? ? }
? ? /**
? ? ?* 使用靜態內部類的方式實現單例模式
? ? ?*/
? ? private static class UploadUtilInstance{
? ? ? ? private static final UploadUtil INSTANCE = new UploadUtil();
? ? }
? ? public static UploadUtil getInstance(){
? ? ? ? return UploadUtilInstance.INSTANCE;
? ? }
?
? ? /**
? ? ?* @param url ? 服務器地址
? ? ?* @param file ?所要上傳的文件
? ? ?* @return ? ? ?響應結果
? ? ?* @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完成文件上傳

/**
? ? ?* 創建線程實現文件的上傳
? ? ?* @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();
? ? }

三、注意事項

在文件上傳時我用的是利用Intent獲取所選文件的Uri,使用了大佬的RealPathFromUriUtils工具類,get到文件的path,然后實例化了File作為參數使用upload方法。

在定義UploadUtil時我使用了單例模式,在保證線程安全的前提下節省資源,提升服務器訪問速率。覺得麻煩的可以不使用單例。

原文鏈接:https://blog.csdn.net/qq_38050382/article/details/93336720

欄目分類
最近更新