android项目中使用的服务器上,Android开发中利用Retrofit如何将图文上传到服务器...

Android开发中利用Retrofit如何将图文上传到服务器

发布时间:2020-12-01 16:27:22

来源:亿速云

阅读:101

作者:Leah

Android开发中利用Retrofit如何将图文上传到服务器?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

前言:现在大多数的项目中都涉及图片+文字上传了,下面请详见实现原理:

开发环境:AndroidStudio

1.引入依赖:

compile 'com.squareup.retrofit2:retrofit:2.1.0'

2.网络权限:

3.创建上传对象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)//设置读取超时时间

.writeTimeout(10, TimeUnit.SECONDS)//设置写的超时时间

.connectTimeout(15, TimeUnit.SECONDS)//设置连接超时时间

.build();

4.上传图片的公有方法:private synchronized final static void uploadImgAndParameter(Map map, String url,

final UIDataListener listener) {

// mImgUrls为存放图片的url集合

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

if (null != map) {

for (Map.Entry 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());

}

}

}

}

//创建RequestBody

RequestBody body = builder.build();

//  MultipartBody requestBody = builder.build();

//构建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()仅可调用一次。否则报IllegalStateException: closed异常

Log.i("file1", "上传照片成功-->" + data);

onSuccess(listener, data);

call.cancel();//上传成功取消请求释放内存

}

}

@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, "网络不稳定请求超时!");

} else {

onError(listener, e.getMessage());

}

call.cancel();//上传失败取消请求释放内存

}

});

}

//注意:添加手机图片,别忘了添加SD卡权限

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)//设置读取超时时间

.writeTimeout(10, TimeUnit.SECONDS)//设置写的超时时间

.connectTimeout(15, TimeUnit.SECONDS)//设置连接超时时间

.build();

/**

* 实例--》添加商品

*/

public static void addCoupon( int shopperId,String shopperName,

File file, final UIDataListener listener) {

String url = "shopappajx/shopAppCouponAction_saveCoupon.htm";

Map 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 map, String url,

final UIDataListener listener) {

// mImgUrls为存放图片的url集合

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

if (null != map) {

for (Map.Entry 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());

}

}

}

}

//创建RequestBody

RequestBody body = builder.build();

//    MultipartBody requestBody = builder.build();

//构建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()仅可调用一次。否则报IllegalStateException: closed异常

Log.i("file1", "上传照片成功-->" + data);

onSuccess(listener, data);

call.cancel();//上传成功取消请求释放内存

}

}

@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, "网络不稳定请求超时!");

} else {

onError(listener, e.getMessage());

}

call.cancel();//上传失败取消请求释放内存

}

});

}

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 {

//网络请求成功

void onSuccess(String data);

//网络请求失败

void onFailure(String errorMassage);

}

}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值