使用volley并结合HttpClient实现上传文件

因为volley默认使用的HttpStack是HttpUrlConnection, 因此咱们须要手动指定用HttpClient
java

mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext(), new HttpClientStack(new DefaultHttpClient()));ide

使用HttpUrlConnection的方式上传文件对body的格式要求较严格, 构造起来较麻烦, 若是实在要用HttpUrlConnection, 能够参考http://www.codejava.net/java-se/networking/upload-files-by-sending-multipart-request-programmatically. 如下是我写的MultipartRequest:ui

public class MultipartRequest extends Request {

    private Response.Listener mListener;
    private HttpEntity mEntity;

    public MultipartRequest(Map<String, String> textBodyParamMap, Map<String, File> fileBodyParamMap, Response.Listener listener, Response.ErrorListener errorListener) {
        super(Method.POST, YOUR_URL, errorListener);

        mListener = listener;
        Charset charset = Charset.forName("UTF-8");
        ContentType contentType = ContentType.create("text/plain", charset);
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE).setCharset(charset);
        for (Map.Entry<String, String> entry : textBodyParamMap.entrySet()) {
            builder.addTextBody(entry.getKey(), entry.getValue(), contentType);
        }
        for (Map.Entry<String, File> entry : fileBodyParamMap.entrySet()) {
            builder.addBinaryBody(entry.getKey(), entry.getValue());
        }
        mEntity = builder.build();
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = new HashMap<String, String>();
        headers.put(HTTP.CHARSET_PARAM, HTTP.UTF_8);
        return headers;
    }

    @Override
    public String getBodyContentType() {
        return mEntity.getContentType().getValue();
    }

    @Override
    public byte[] getBody() {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            mEntity.writeTo(baos);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return baos.toByteArray();
    }

    @Override
    protected Response parseNetworkResponse(NetworkResponse response) {
        JSONObject jo = null;
        try {
            jo = new JSONObject(new String(response.data, HttpHeaderParser.parseCharset(response.headers)));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return Response.success(jo, HttpHeaderParser.parseCacheHeaders(response));
    }

    @Override
    protected void deliverResponse(Object response) {
        mListener.onResponse(response);
    }
}
相关文章
相关标签/搜索