Volley以流的形式上传图片,参考了某大神代码
public class PostUploadRequest extends Request {
public static final String TAG = PostUploadRequest.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<FormImage> mListItem ;
public PostUploadRequest(int method, String url,List<FormImage> 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 PostUploadRequest(int method, String url,FormImage formImage, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
ArrayList<FormImage> formImages = new ArrayList<FormImage>();
formImages.add(formImage);
this.mListener = listener ;
setShouldCache(false);
mListItem = formImages ;
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() ;
FormImage formImage ;
for (int i = 0; i < N ;i++){
formImage = mListItem.get(i) ;
StringBuffer sb = new StringBuffer();
sb.append(PREFIX);
sb.append(BOUNDARY);
sb.append(LINE_END);
// 相关参数需与后台一致
// sb.append("Content-Disposition: form-image; name=\"file\"; filename=\"" + formImage.getFileName() + "\"" + LINE_END);
sb.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + formImage.getFileName() + "\"" + LINE_END);
sb.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINE_END);
sb.append(LINE_END);
try {
bos.write(sb.toString().getBytes(CHARSET));
bos.write(formImage.getValue());
} 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();
}
}
public class FormImage {
private String fileName ;
private Bitmap bitmap ;
public void setFileName(String fileName){
this.fileName = fileName;
}
public String getFileName() {
return fileName;
}
public void setBitmap(Bitmap bitmap ){
this.bitmap = bitmap;
}
public Bitmap getBitmap() {
return bitmap;
}
public byte[] getValue() {
ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
bitmap.compress(Bitmap.CompressFormat.JPEG,80,bos) ;
return bos.toByteArray();
}