日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android http文件上传,Android Http文件上传方法和实践

發布時間:2025/3/17 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android http文件上传,Android Http文件上传方法和实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文件上傳在應用中是比較常用的的一種功能,比如用戶的意見反饋功能。用戶可以上傳圖片,音視頻等文件,方便用戶反饋問題的情況。

下來我將和大家一起梳理下需要掌握的知識,少走彎路一步到位,實現文件上傳功能。

第一步:了解請求頭

需要先大致了解一下上傳信息需要的請求結構。當我們掌握了請求頭的結構,就可以根據自己項目情況選擇sdk或者自己實現HTTP請求。

使用HTTP進行文件上傳需要用到POST請求。POST請求包含請求Head 和請求Body。

上傳文件需要使用 Content-type為multipart/form-data 的格式,發送請求信息。這種格式的數據會有一個邊界線用于分割不同的字段。如下文中的:boundary=86489a0c-3d1f-4351-8f49-58315690babe

請求Head: 一般會攜帶客戶端的一些信息包括簽名,token等。服務端用這些信息來校驗是否合法。

請求Body: 會攜帶文件的信息和相關的參數便于服務端進行區分。

消息頭可以攜帶簽名信息等字段,用于服務端校驗。請求頭中的 head1 和head2,代表token,uuid,key等信息用于校驗。

POST https://*****/upload

Content-Type: multipart/form-data; boundary=86489a0c-3d1f-4351-8f49-58315690babe

Content-Length: 83014

head1: param

head2: param

消息主體以分界線開始,緊接著就是內容描述信息,可以攜帶多個字段進行資源數據的描述。最后是字段具體的內容(文本或二進制)。

請求體中的param1 和param2 代表攜帶文件的相關參數信息,比如文件擴展名等,方便服務端進行區分

--86489a0c-3d1f-4351-8f49-58315690babe

Content-Disposition: form-data; name="param1"

Content-Length: 8

param1

--86489a0c-3d1f-4351-8f49-58315690babe

Content-Disposition: form-data; name="param2"

Content-Length: 3

param2

--86489a0c-3d1f-4351-8f49-58315690babe

Content-Disposition: form-data; name="file"; filename="pic.png"

Content-Type: application/otcet-stream

Content-Length: 82560

*****

--86489a0c-3d1f-4351-8f49-58315690babe

消息主體以boundary結束。

第二步:實踐

我們將用目前比較流行的框架實現上面的結構。為了方便了解,我會一一對應的結構,實現上面的Post接口,實際應用中可以充分利用框架的進行接口優化。

方案1:直接使用OKHttp 上傳文件

File file= new File(file);

// 構建okhttpclient,使用HttpLoggingInterceptor 打印調試日志

OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();

clientBuilder.connectTimeout(Config.DEFAULT_TIMEOUT, TimeUnit.SECONDS);

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();

loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

clientBuilder.addInterceptor(loggingInterceptor);

OkHttpClient client = clientBuilder.build();

// 構造請求頭

Headers.Builder headerBuilder = new Headers.Builder();

headerBuilder.add("head1","***");

headerBuilder.add("head2","***");

// 構造請求體

MultipartBody.Builder builder = new MultipartBody.Builder();

builder.setType(MultipartBody.FORM);

builder.addPart(

Headers.of("Content-Disposition", "form-data; name=\"param1\""),

RequestBody.create(null, "param1"));

builder.addPart(

Headers.of("Content-Disposition", "form-data; name=\"param2\""),

RequestBody.create(null, "param2"));

MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");

RequestBody filebody = MultipartBody.create(MEDIA_TYPE_PNG, file);

builder.addFormDataPart("file",file.getName(),filebody);

MultipartBody body = builder.build();

// 構造請求

Request request = new Request.Builder()

.headers(headerBuilder.build())

.url("***********")

.post(body)

.build();

// 發起請求

Call call = client.newCall(request);

call.enqueue(new Callback() {

@Override

public void onFailure(Call call, IOException e) {

}

@Override

public void onResponse(Call call, Response response) throws IOException {

}

});

方案2:利用Retrofit 上傳文件

實例化Retroift 對象

// 構造okhttp

OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();

clientBuilder.connectTimeout(Config.DEFAULT_TIMEOUT, TimeUnit.SECONDS);

// 打印網絡請求日志

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();

loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

clientBuilder.addInterceptor(loggingInterceptor);

mOkHttpClient = httpClientBuilder.build();

// 構造Retrofit

mRetrofit = new Retrofit.Builder()

.client(mOkHttpClient)

.baseUrl(BASE_URL)

// 增加 Gson轉換

.addConverterFactory(GsonConverterFactory.create())

.build();

定義Retrofit接口

@Multipart

@POST("***")

Call uploadFile(@Header("head1") String head1,

@Header("head2") String head2,

@Part MultipartBody.Part param1,

@Part MultipartBody.Part param2,

@Part MultipartBody.Part multipartBody);

調用Retrofit接口

mApiService = NetworkService.getInstance().getService(Api.class);

//請求體

MultipartBody.Part param1 = MultipartBody.Part.createFormData("param1", "param1");

MultipartBody.Part param2 = MultipartBody.Part.createFormData("param2", "param2");

File file = new File("path");

RequestBody body = RequestBody.create(MediaType.parse("application/otcet-stream"), file);

MultipartBody.Part filebody = MultipartBody.Part.createFormData("file",file.getName(),body);

call = mApiService.uploadFile("head1","head2",param1,param2,filebody);

call.enqueue(new Callback() {

@Override

public void onResponse(Call call,

}

@Override

public void onFailure(Call call, Throwable t) {

}

});

調試工具

對于在家沒有后端支持的同學,可以使用 Http File Server 在局域網類部署服務端,然后進行接口測試。

Http File Server 工具可以在百度上搜到,使用的中可以關閉用戶校驗功能。

總結

以上是生活随笔為你收集整理的android http文件上传,Android Http文件上传方法和实践的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。