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

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

(0)

相关推荐

  • Retrofit2.0 实现图文(参数+图片)上传方法总结

    最近项目里用到了类似图文上传的功能,以前都是封装OkHttp的文件上传功能,这次想换个姿势,想用Retrofit2.0实现这样的功能,本来以为挺简单的,没想到进入了深坑,连续调整了好几种姿势都报了同一个错,接着网上类似的文章找了一大推,讲得都是模棱两可,或者对多参数格式不够友好,最后还是去看了相关的源码,自己把这个问题提出来解决了,在这里记录一下. 一.定义网络请求接口 public interface GoodsReturnApiService { @Multipart @POST(Compa

  • Android Retrofit实现多图片/文件、图文上传功能

    什么是 Retrofit ? Retrofit是Square开发的一个Android和Java的REST客户端库.这个库非常简单并且具有很多特性,相比其他的网络库,更容易让初学者快速掌握.它可以处理GET.POST.PUT.DELETE-等请求,还可以使用picasso加载图片. 一.再次膜拜下Retrofit Retrofit无论从性能还是使用方便性上都很屌!!!,本文不去介绍其运作原理(虽然很想搞明白),后面会出专题文章解析Retrofit的内部原理:本文只是从使用上解析Retrofit实现

  • Retrofit实现图文上传至服务器

    前言:现在大多数的项目中都涉及图片+文字上传了,下面请详见实现原理: 开发环境:AndroidStudio 1.引入依赖: compile 'com.squareup.retrofit2:retrofit:2.1.0'   2.网络权限: <uses-permission android:name="android.permission.INTERNET" />   3.创建上传对象OkHttpClient : private static final OkHttpClie

  • Java实现图片上传到服务器并把上传的图片读取出来

    在很多的网站都可以实现上传头像,可以选择自己喜欢的图片做头像,从本地上传,下次登录时可以直接显示出已经上传的头像,那么这个是如何实现的呢? 下面说一下我的实现过程(只是个人实现思路,实际网站怎么实现的不太清楚) 实现的思路: 工具:MySQL,eclipse 首先,在MySQL中创建了两个表,一个t_user表,用来存放用户名,密码等个人信息, 一个t_touxiang表,用来存放上传的图片在服务器中的存放路径,以及图片名字和用户ID, T_touxiang表中的用户ID对应了t_user中的i

  • 基于HTML5+js+Java实现单文件文件上传到服务器功能

    上传单文件到服务器       应公司要求,在HTML5页面上实现上传文件到服务器,对于一个还没毕业的实习生菜鸟来说,这可不得了-----不会,网上各种百度,找各种博客还是没解决,最后还是请教了公司的大神,人家给卸了一个例子,然后根据人家写的终于把这个上传文件搞定. 好了,开始上代码. HTML5代码: <form name="upform" action="" method="POST"> <input type ="

  • asp将本地的文件上传到服务器

    今天我们讲解如何利用asp的上传功能将本地的文件上传到服务器上. 最简系统包括下面三个文件: upload.htm                         --上传口文件,选择本地文件 uploadimg.asp                  --上传程序控制文件 upload_5xsoft.inc            --无组件上传类,此文件初学者不用学习,只要会用就可以了 upload.htm内容----上传口文件,选择本地文件 <html> <head> <

  • 远程图片自动按文件夹上传到服务器-默飞出品

    远程图片自动按文件夹上传到服务器-默飞出品 a { text-decoration: none; color: blue } a:hover { text-decoration: underline } body { scrollbar-base-color: #F8F8F8; scrollbar-arrow-color: #698CC3; font-size: 12pt; background-color: #ffffff } 在输入框中输入远程图片地址,如图片不存在,程序自动放弃本次操作.

  • PHP实现微信图片上传到服务器的方法示例

    本文实例讲述了PHP实现微信图片上传到服务器的方法.分享给大家供大家参考,具体如下: $pic_img=trim( $postObj->PicUrl); if($type=="image"){ $pic_url=save_file_to_sever($pic_img,$fromUsername); } GetRootPath(){ $sRealPath = realpath('./'); $sSelfPath = $_SERVER['PHP_SELF']; $sSelfPath

  • PHP多个文件上传到服务器实例

    本文实例讲述了PHP多个文件上传到服务器的实现方法.对于多个文件同时上传到服务器的情况来说,我们需要使用到数组形式的参数传递及数据的遍历上传即可,具体的操作步骤分析如下: 一.实例说明 上传图片到服务器,是程序开发过程中必不可少的一个功能.它不但可以达到图片共享的目的,而且可以提高网站的访问量,丰富网站的内容.在本实例中,讲解如何通过POST方式实现多图片上传. 二.关键技术 多文件上传的关键是如何定义上传文件元素的名称及如何判断上传文件的数量.在本实例中,以数组的形式定义上传文件的名称(上传文

  • NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法

    实现多文件拖拽上传的简易Node项目,可以在github上下载,你可以先下载下来:https://github.com/Johnharvy/upLoadFiles/. 解开下载下的zip格式包,建议用webstom 运行该项目,通过app.js启动项目,如果提示找不到node.exe执行环境,请指定好你的node.exe安装位置.这里我用的express框架是3.21.2版本. 我们来简单介绍下拖拽效果是怎么实现的. 这里先看代码: <!DOCTYPE html> <html lang=

  • 微信小程序图片选择、上传到服务器、预览(PHP)实现实例

    微信小程序图片选择.上传到服务器.预览(PHP)实现实例 小程序实现选择图片.预览图片.上传到开发者服务器上 后台使用的tp3.2 图片上传 请求时候的header参考时可以去掉(个人后台验证权限使用) 小程序前端代码: <view class="section"> <form bindsubmit="bindFormSubmit"> <textarea placeholder="请输入问题内容" name=&quo

随机推荐