Volley-XUtils-OkHttp三種方式實現單張多張圖片上傳

OkHttp能夠做爲Volley底層傳輸協議,速度更快,傳大量圖片建議使用。OkHttp更多功能請看OkHttp的使用html

xUtils 支持大文件上傳,更全面的http請求協議支持(10種謂詞),擁有更加靈活的ORM,更多的事件註解支持且不受混淆影響...android

xUtils一共有4大功能:註解模塊,網絡模塊,圖片加載模塊,數據庫模塊。相關請看xUtils框架的使用博客git

使用Volley上傳,豬喲是繼承volley的Request類,而後經過使用httpmim的MultipartEntity類對文件參數進行封裝。github

Volley更多功能請看Volley框架使用數據庫

所需的jar包:網絡

 

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

httpcore-4.3.2.jar,        httpmime-4.3.5async

okhttp.jarokio.jarvolley.jarxUtils-2.6.2.jaride

 

OkHttp代碼:oop

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:

public static void addPutUploadFileRequest(final Map<String, File> files,  
            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-permissionandroid:name="android.permission.INTERNET"/>

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

 

本人測試所有成功了的

因爲代碼太多,完整代碼未給出,源碼直接下載便可

 

源碼點擊下載:  https://github.com/DickyQie/android-picture-upload

相關文章
相關標籤/搜索