zoukankan      html  css  js  c++  java
  • 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 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);
        }
    }
  • 相关阅读:
    Ant 执行 exec cmd.exe 时路径包含空格的问题
    时区时差换算(GMT,UTC,PST,PDT)
    windows 共存多个位数不同的jdk时,eclipse的报错对应措施
    Windows下查询指定端口进程,并杀死
    关于windows的jdk
    第一阶段工作总结
    mac配置git mergetool为p4merge(2013笔记整理)
    ubuntu 14.04 安装压缩包版mysql
    关于微信公众号内嵌网页的几个meta标签
    关于js的keyCode
  • 原文地址:https://www.cnblogs.com/xxdh/p/6633195.html
Copyright © 2011-2022 走看看