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

原创
2015/01/18 20:35
阅读数 2K

由于volley默认使用的HttpStack是HttpUrlConnection, 所以我们需要手动指定用HttpClient

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

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

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


展开阅读全文
打赏
0
8 收藏
分享
加载中
你不报这个错误么?java.lang.NoSuchFieldError: org.apache.http.message.BasicHeaderValueFormatter.INSTANCE

其实就是httpclent冲突
2015/06/30 18:06
回复
举报
更多评论
打赏
1 评论
8 收藏
0
分享
返回顶部
顶部