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文件上传方法和实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OJ1064: 加密字符(C语言)
- 下一篇: GARFIELD@10-16-2004