Android中利用volley同时上传文件和文本参数
前言
在做项目时利用了Volley网络库与服务器之间进行通信,但Volley并没有现成的上传文件的Request可以调用,网上搜索一圈发现很多都是基于HttpClient进行自定义Request封装,可是无奈android 6.0之后移除了HttpClient的代码,只能自己基于HttpURLConnection封装一个Request使用。
继承Request,重写一些方法
由于我的项目中服务器返回的结果都是json格式,所以我自定义一个返回结果是json格式的request,你也可以换成String格式,或者其他你需要的格式。
public class PostUploadRequest extends Request<JSONObject>{
public PostUploadRequest(String url, Map<String, String[]> fileMap, Response.Listener<JSONObject> mListener, Response.ErrorListener listener) {
super(Method.POST, url, listener);
this.mListener = mListener;
this.fileMap = fileMap;
setShouldCache(false);
setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
}
}
重写parseNetworkResponse()方法
将返回结果转换成json格式
try {
String je = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(je), HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException var3) {
return Response.error(new ParseError(var3));
} catch (JSONException var4) {
return Response.error(new ParseError(var4));
}
重写deliverResponse()方法
为请求添加监听回调事件
@Override
protected void deliverResponse(JSONObject jsonObject) {
mListener.onResponse(jsonObject);
}
模仿浏览器上传文件请求
private void buildFilePart(DataOutputStream ds) {
StringBuilder sb = new StringBuilder();
Object[] key_arr = fileMap.keySet().toArray();
for (Object name : key_arr) {
String[] val = fileMap.get(name.toString());
String path = val[0];
String filename = val[1];
try {
sb.append(prefix);
sb.append(boundary);
sb.append(end)