Volley上传文件:
public class UploadFileRequest extends Request<JSONObject> {
public static final String TAG = UploadFileRequest.class.getSimpleName();
private static final String CHARSET = "utf-8"; //设置编码
String BOUNDARY = UUID.randomUUID().toString(); //边界标识 随机生成
String PREFIX = "--", LINE_END = "\r\n";
String CONTENT_TYPE = "multipart/form-data"; //内容类型
/**
* 正确数据的时候回掉用
*/
private Response.Listener<JSONObject> mListener;
/*请求 数据通过参数的形式传入*/
private List<File> mListItem;
public UploadFileRequest(int method, String url, List<File> listItem,
Response.Listener<JSONObject> listener,
Response.ErrorListener errorListener) {
super(method, url, errorListener);
this.mListener = listener;
setShouldCache(false);
mListItem = listItem;
setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
}
public UploadFileRequest(int method, String url, File file,
Response.Listener<JSONObject> listener,
Response.ErrorListener errorListener) {
super(method, url, errorListener);
ArrayList<File> files = new ArrayList<File>();
files.add(file);
this.mListener = listener;
setShouldCache(false);
mListItem = files;
setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
}
/**
* 这里开始解析数据
*
* @param response Response from the network
* @return
*/
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers, CHARSET));
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
@Override
protected void deliverResponse(JSONObject response) {
mListener.onResponse(response);
}
@Override
public byte[] getBody() throws AuthFailureError {
if (mListItem == null || mListItem.size() == 0) {
return super.getBody();
}
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int N = mListItem.size();
File file;
for (int i = 0; i < N; i++) {
file = mListItem.get(i);
StringBuffer sb = new StringBuffer();
sb.append(PREFIX);
sb.append(BOUNDARY);
sb.append(LINE_END);
/**
* name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件
* filename是文件的名字,包含后缀名的 比如:abc.png
*/
sb.append(
"Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() +
"\"" + LINE_END);
sb.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINE_END);
sb.append(LINE_END);
try {
bos.write(sb.toString().getBytes(CHARSET));
InputStream is = new FileInputStream(file);
byte[] bytes = new byte[1024];
int len = 0;
while ((len = is.read(bytes)) != -1) {
bos.write(bytes, 0, len);
}
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
bos.write(LINE_END.getBytes(CHARSET));
byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes(CHARSET);
bos.write(end_data);
bos.flush();
} catch (IOException e) {
e.printStackTrace();
}
return bos.toByteArray();
}
@Override
public String getBodyContentType() {
return CONTENT_TYPE + ";boundary=" + BOUNDARY;
}
private HashMap<String, String> map;
public void setHeader(HashMap<String, String> map) {
this.map = map;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
if (null != map) {
return map;
}
return super.getHeaders();
}
}