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

来源:互联网 发布:外贸数据网 编辑:程序博客网 时间:2024/05/29 10:43

由于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 0