Retrofit實現(xiàn)圖文上傳至服務(wù)器
前言:現(xiàn)在大多數(shù)的項目中都涉及圖片+文字上傳了,下面請詳見實現(xiàn)原理:
開發(fā)環(huán)境:AndroidStudio
1.引入依賴:
compile 'com.squareup.retrofit2:retrofit:2.1.0'
2.網(wǎng)絡(luò)權(quán)限:
<uses-permission android:name="android.permission.INTERNET" />
3.創(chuàng)建上傳對象OkHttpClient :
private static final OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain
.request()
.newBuilder()
.build();
return chain.proceed(request);
}
})
.readTimeout(10, TimeUnit.SECONDS)//設(shè)置讀取超時時間
.writeTimeout(10, TimeUnit.SECONDS)//設(shè)置寫的超時時間
.connectTimeout(15, TimeUnit.SECONDS)//設(shè)置連接超時時間
.build();
4.上傳圖片的公有方法:
private synchronized final static void uploadImgAndParameter(Map<String, Object> map, String url,
final UIDataListener listener) {
// mImgUrls為存放圖片的url集合
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
if (null != map) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (entry.getValue() != null) {
if (entry.getValue() instanceof File) {
File f = (File) entry.getValue();
builder.addFormDataPart(entry.getKey(), f.getName(), RequestBody.create(MEDIA_TYPE_PNG, f));
} else {
builder.addFormDataPart(entry.getKey(), entry.getValue().toString());
}
}
}
}
//創(chuàng)建RequestBody
RequestBody body = builder.build();
// MultipartBody requestBody = builder.build();
//構(gòu)建Request請求
final Request request = new Request.Builder()
.url(url)//地址
.post(body)//添加請求體
// .post(requestBody)//添加請求體
.build();
client.newCall(request).enqueue(new okhttp3.Callback() {
@Override
public void onResponse(Call call, final Response response) throws IOException {
if (response.isSuccessful()) {//判斷是否成功
final String data = response.body().string();//string()僅可調(diào)用一次。否則報IllegalStateException: closed異常
Log.i("file1", "上傳照片成功-->" + data);
onSuccess(listener, data);
call.cancel();//上傳成功取消請求釋放內(nèi)存
}
}
@Override
public void onFailure(Call call, final IOException e) {
Log.i("file2", "上傳失敗-->" + e.getMessage());
String msg = e.getMessage();
if (msg == null || msg.equals("timeout")) {
onError(listener, "網(wǎng)絡(luò)不穩(wěn)定請求超時!");
} else {
onError(listener, e.getMessage());
}
call.cancel();//上傳失敗取消請求釋放內(nèi)存
}
});
}
//注意:添加手機圖片,別忘了添加SD卡權(quán)限
5.全部代碼:
public class HttpUtil {
private static final Handler handler = new Handler(Looper.getMainLooper());
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/*");
private static final OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain
.request()
.newBuilder()
.build();
return chain.proceed(request);
}
})
.readTimeout(10, TimeUnit.SECONDS)//設(shè)置讀取超時時間
.writeTimeout(10, TimeUnit.SECONDS)//設(shè)置寫的超時時間
.connectTimeout(15, TimeUnit.SECONDS)//設(shè)置連接超時時間
.build();
/**
* 實例--》添加商品
*/
public static void addCoupon( int shopperId,String shopperName,
File file, final UIDataListener listener) {
String url = "shopappajx/shopAppCouponAction_saveCoupon.htm";
Map<String, Object> map = new HashMap<>();
map.put("shopperId", shopperId);
map.put("shopperName", shopperName);
map.put("couponImage", file);//商品圖片
uploadImgAndParameter(map, url, listener);
}
//上傳圖片共有方法
private synchronized final static void uploadImgAndParameter(Map<String, Object> map, String url,
final UIDataListener listener) {
// mImgUrls為存放圖片的url集合
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
if (null != map) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (entry.getValue() != null) {
if (entry.getValue() instanceof File) {
File f = (File) entry.getValue();
builder.addFormDataPart(entry.getKey(), f.getName(), RequestBody.create(MEDIA_TYPE_PNG, f));
} else {
builder.addFormDataPart(entry.getKey(), entry.getValue().toString());
}
}
}
}
//創(chuàng)建RequestBody
RequestBody body = builder.build();
// MultipartBody requestBody = builder.build();
//構(gòu)建Request請求
final Request request = new Request.Builder()
.url(url)//地址
.post(body)//添加請求體
// .post(requestBody)//添加請求體
.build();
client.newCall(request).enqueue(new okhttp3.Callback() {
@Override
public void onResponse(Call call, final Response response) throws IOException {
if (response.isSuccessful()) {//判斷是否成功
final String data = response.body().string();//string()僅可調(diào)用一次。否則報IllegalStateException: closed異常
Log.i("file1", "上傳照片成功-->" + data);
onSuccess(listener, data);
call.cancel();//上傳成功取消請求釋放內(nèi)存
}
}
@Override
public void onFailure(Call call, final IOException e) {
Log.i("file2", "上傳失敗-->" + e.getMessage());
String msg = e.getMessage();
if (msg == null || msg.equals("timeout")) {
onError(listener, "網(wǎng)絡(luò)不穩(wěn)定請求超時!");
} else {
onError(listener, e.getMessage());
}
call.cancel();//上傳失敗取消請求釋放內(nèi)存
}
});
}
private final static void onSuccess(final UIDataListener listener, final String data) {
handler.post(new Runnable() {
public void run() {
// 需要在主線程的操作。
listener.onSuccess(data);
}
});
}
private final static void onError(final UIDataListener listener, final String msg) {
if (null != listener) {
handler.post(new Runnable() {
public void run() {
// 需要在主線程的操作。
listener.onFailure(msg);
}
});
}
}
public interface UIDataListener {
//網(wǎng)絡(luò)請求成功
void onSuccess(String data);
//網(wǎng)絡(luò)請求失敗
void onFailure(String errorMassage);
}
}
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關(guān)文章
Android應(yīng)用開發(fā)中模擬按下HOME鍵的效果(實現(xiàn)代碼)
Android應(yīng)用開發(fā)中, 有一種場景,就是我們不希望用戶直接按Back鍵退出Activity,而是希望應(yīng)用隱藏到后臺,類似于按Home鍵的效果2013-05-05
Android模擬器實現(xiàn)手機添加文件到sd卡的方法
這篇文章主要介紹了Android模擬器實現(xiàn)手機添加文件到sd卡的方法,詳細分析了Android模擬器添加文件到sd卡的步驟與相關(guān)技巧,需要的朋友可以參考下2016-06-06
Android Compose實現(xiàn)伸縮ToolBar的思路詳解
這篇文章主要介紹了Android Compose之伸縮ToolBar的實現(xiàn),本文給大家分享主要實現(xiàn)思路及實現(xiàn)過程,通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2021-10-10
Android 中clipToPadding 和 clipChildren區(qū)別和作用
這篇文章主要介紹了Android 中clipToPadding 和 clipChildren區(qū)別和作用的相關(guān)資料,需要的朋友可以參考下2017-06-06
新浪微博第三方登錄界面上下拉伸圖片之第三方開源PullToZoomListViewEx(二)
這篇文章主要介紹了新浪微博第三方登錄界面上下拉伸圖片之第三方開源PullToZoomListViewEx(二) 的相關(guān)資料,需要的朋友可以參考下2015-12-12
Android自定義View實現(xiàn)圓形環(huán)繞效果
這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)圓形環(huán)繞效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01
Android 仿高德地圖可拉伸的BottomSheet的示例代碼
這篇文章主要介紹了Android 仿高德地圖可拉伸的BottomSheet的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07

