全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Retrofit实现图文上传至服务器

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

开发环境:AndroidStudio

1.引入依赖:

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

2.网络权限:

<uses-permission android:name="android.permission.INTERNET" />  

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<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());
     }
    }
   }
  }
  //创建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<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());
          }
        }
      }
    }
    //创建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);
  }
}

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


# retrofit  # 图文上传  # retrofit实现图片上传  # retrofit上传文件  # 简略分析Android的Retrofit应用开发框架源码  # Android网络请求框架Retrofit详解  # 详解Retrofit2.0 公共参数(固定参数)  # Android Retrofit的简单介绍和使用  # Android Retrofit的使用详解  # Retrofit 源码分析初探  # Retrofit自定义请求参数注解的实现思路  # 上传  # 不稳定  # 上传图片  # 判断是否  # 上传照片  # 别忘了  # 中都  # 传了  # proceed  # readTimeout  # TimeUnit  # SECONDS  # return  # Request 


相关文章: 建站之星官网登录失败?如何快速解决?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  C++如何编写函数模板?(泛型编程入门)  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  详解jQuery中基本的动画方法  建站之星logo尺寸如何设置最合适?  建站主机与虚拟主机有何区别?如何选择最优方案?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  如何在IIS中新建站点并解决端口绑定冲突?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  建站之星24小时客服电话如何获取?  教程网站设计制作软件,怎么创建自己的一个网站?  如何快速搭建高效WAP手机网站?  制作营销网站公司,淘特是干什么用的?  大型企业网站制作流程,做网站需要注册公司吗?  广州美橙建站如何快速搭建多端合一网站?  网站制作话术技巧,网站推广做的好怎么话术?  北京网站制作网页,网站升级改版需要多久?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  在线制作视频的网站有哪些,电脑如何制作视频短片?  中山网站推广排名,中山信息港登录入口?  如何快速上传建站程序避免常见错误?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  成都网站制作报价公司,成都工业用气开户费用?  建站主机类型有哪些?如何正确选型  盐城做公司网站,江苏电子版退休证办理流程?  自助网站制作软件,个人如何自助建网站?  行程制作网站有哪些,第三方机票电子行程单怎么开?  如何基于PHP生成高效IDC网络公司建站源码?  如何配置WinSCP新建站点的密钥验证步骤?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  装修招标网站设计制作流程,装修招标流程?  如何用5美元大硬盘VPS安全高效搭建个人网站?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  制作证书网站有哪些,全国城建培训中心证书查询官网?  如何快速搭建高效WAP手机网站吸引移动用户?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  宝塔面板创建网站无法访问?如何快速排查修复?  香港服务器租用每月最低只需15元?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  视频网站制作教程,怎么样制作优酷网的小视频?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  宝塔新建站点为何无法访问?如何排查?  如何用y主机助手快速搭建网站?  大连 网站制作,大连天途有线官网? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。