栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Retrofit实现图文上传至服务器

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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
  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);
  }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持考高分网!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/159191.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号