Volley-XUtils-OkHttp三种方式实现单张多张图片上传

OkHttp可以作为Volley底层传输协议,速度更快,传大量图片建议使用。OkHttp更多功能请看OkHttp的使用

xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响...

xUtils一共有4大功能:注解模块,网络模块,图片加载模块,数据库模块。相关请看xUtils框架的使用博客

使用Volley上传,猪哟是继承volley的Request类,然后通过使用httpmim的MultipartEntity类对文件参数进行封装。

Volley更多功能请看Volley框架使用

所需的jar包:

httpclient-4.3.5.jarandroid-async-http-1.4.4.jar

httpcore-4.3.2.jarhttpmime-4.3.5

okhttp.jarokio.jarvolley.jarxUtils-2.6.2.jar

OkHttp:

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 {  
                okhttp3.Request request = chain.request().newBuilder()  
                        .build();  
                return chain.proceed(request);  
            }  
        }).readTimeout(15, TimeUnit.SECONDS)// 设置读取超时时间  
        .writeTimeout(15, TimeUnit.SECONDS)// 设置写的超时时间  
        .connectTimeout(15, TimeUnit.SECONDS)// 设置连接超时时间  
        .build();  
  
// 上传图片公有方法  
private final static void uploadImgAndParameter(Map<String, Object> map,  
        String url) {  
  
    // 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();  
    final okhttp3.Request request = new okhttp3.Request.Builder().url(url)// 地址  
            .post(body)// 添加请求体  
            .build();  
    client.newCall(request).enqueue(new okhttp3.Callback() {  
  
        @Override  
        public void onResponse(Call call, final Response response)  
                throws IOException {  
            final String data = response.body().string();  
            Log.i(TAG, "上传照片成功-->" + data);  
            call.cancel();// 上传成功取消请求释放内存  
        }  
  
        @Override  
        public void onFailure(Call call, final IOException e) {  
            Log.i(TAG, "上传失败-->" + e.getMessage());  
            call.cancel();// 上传失败取消请求释放内存  
        }  
  
    });  
  
}  

XUtils:

   HttpUtils http = new HttpUtils();  
   RequestParams params = new RequestParams();  
   params.addBodyParameter("c", "comment");  
   params.addBodyParameter("a", "add");  
   params.addBodyParameter("uid", "1000191");  
   params.addBodyParameter("dataid", "1114");  
   params.addBodyParameter("message", "你好");  
   params.addBodyParameter("datatype", "goodsid");  
   for (int i = 0; i < 2; i++) {  
         params.addBodyParameter("filedata" + i, file[i]);  
   }  
   http.send(HttpRequest.HttpMethod.POST, url, params,  
          new RequestCallBack<String>() {  
  
           @Override  
            public void onFailure(HttpException arg0, String arg1) {  
  
             }  
  
            @Override  
             public void onSuccess(ResponseInfo<String> arg0) {  
                 Log.i(TAG, arg0.result.toString());  
            }  
  
});  

Volley:

        final Map<String, String> params,  
        final Listener<String> responseListener,  
        final ErrorListener errorListener) {  
    if (null == url || null == responseListener) {  
        return;  
    }  

    MultiPartStringRequest multiPartRequest = new MultiPartStringRequest(  
            Request.Method.POST, url, responseListener, errorListener) {  

        @Override  
        public Map<String, File> getFileUploads() {  
            return files;  
        }  

        @Override  
        public Map<String, String> getStringUploads() {  
            return params;  
        }  

    };  

    mSingleQueue.add(multiPartRequest);  
}  

Listener<JSONObject> mResonseListener = new Listener<JSONObject>() {  

    @Override  
    public void onResponse(JSONObject response) {  
        Log.i(TAG + "1", response.toString());  
    }  
};  

Listener<String> mResonseListenerString = new Listener<String>() {  

    @Override  
    public void onResponse(String response) {  
        Log.i(TAG + "2", response.toString());  
    }  
};  

ErrorListener mErrorListener = new ErrorListener() {  

    @Override  
    public void onErrorResponse(VolleyError error) {  
        if (error != null) {  
            if (error.networkResponse != null)  
                Log.i(TAG + "3", " error "  
                        + new String(error.networkResponse.data));  
        }  
    }  
};  

不要忘记在AndroidManifest.xml加权限哦!
<uses-permission android:nameuses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permission android:nameuses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

本人测试全部成功了的

由于代码太多,完整代码未给出,源码直接下载即可

源码点击下载: https://github.com/DickyQie/android-picture-upload
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容