发现问题
项目中有发表动态的功能,该功能可以将文本和图片上传至服务器。
Volley通过定制PostUploadRequest实现文件上传的功能,本文以一张图片上传为例。
数据格式
以下为项目中图片上传实例的数据格式
多张图片上传可通过添加——WebKitFormBoundary 内容实现
POST /CloudLife/user/social HTTP/1.1
Host: localhost
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*
public class FormImage {
// 参数的名称
private String mName;
// 文件名
private String mFileName;
// 文件的 mime,需要根据文档查询
private String mMime;
// 需要上传的图片资源,因为这里测试为了方便起见,直接把 bitmap 传进来,真正在项目中一般不会这般做,
// 而是把图片的路径传过来,在这里对图片进行二进制转换
private Bitmap mBitmap = null;
public FormImage(Bitmap bitmap) {
this.mBitmap = bitmap;
}
public String getName() {
return "file";
}
public String getFileName() {
return "add.png";
}
// 对图片进行二进制转换
public byte[] getValue() {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
mBitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);
return bos.toByteArray();
}
// 因为我知道是 png 文件,所以直接根据文档查的
public String getMime() {
return "image/png";
}
}
定制PostUploadRequest
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; import org.apache.http.protocol.HTTP; import org.json.JSONException; import org.json.JSONObject; import com.android.volley.AuthFailureError; import com.android.volley.DefaultRetryPolicy; import com.android.volley.NetworkResponse; import com.android.volley.ParseError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.toolbox.HttpHeaderParser; import android.util.Log; public class PostUploadRequest extends Request{ private Map sendHeader = new HashMap (); // 正确数据的时候回掉用 private Response.Listener mListener; // 请求 数据通过参数的形式传入 private String content; private FormImage mImage; // 数据分隔线 private String BOUNDARY = "----CloudLifeUpLoadImage"; private String MULTIPART_FORM_DATA = "multipart/form-data"; public PostUploadRequest(String url, String text, FormImage Item, Response.Listener listener,Response.ErrorListener errorListener) { super(Method.POST, url, errorListener); this.mListener = listener; setShouldCache(false); mImage = Item; content = text; // 设置请求的响应事件,因为文件上传需要较长的时间,所以在这里加大了,设为5秒 setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); } @Override protected Response parseNetworkResponse(NetworkResponse response) { try { // 防止中文乱码 @SuppressWarnings("deprecation") String jsonString = new String(response.data, HTTP.UTF_8); JSonObject jsonObject = new JSonObject(jsonString); Log.w("upLoad", "jsonObject " + jsonObject.toString()); return Response.success(jsonObject, 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 Map getHeaders() throws AuthFailureError { return sendHeader; } public void setSendcookie(String cookie) { sendHeader.put("cookie", cookie); } @Override public byte[] getBody() throws AuthFailureError { ByteArrayOutputStream bos = new ByteArrayOutputStream(); StringBuffer sb = new StringBuffer(); if (content == null) { // `"--" + BOUNDARY + "rn"` sb.append("--" + BOUNDARY + "rn"); // Content-Disposition: form-data; name="参数的名称"; filename="上传的文件名" + // "rn" sb.append("Content-Disposition: form-data;"); sb.append(" name=""); sb.append(mImage.getName()); sb.append("""); sb.append("; filename=""); sb.append(mImage.getFileName()); sb.append("""); sb.append("rn"); // Content-Type: 文件的 mime 类型 + "rn" sb.append("Content-Type: "); sb.append(mImage.getMime()); sb.append("rn"); // "rn" 空白的一行 sb.append("rn"); try { bos.write(sb.toString().getBytes("utf-8")); // 文件的二进制数据 + "rn" bos.write(mImage.getValue()); bos.write("rn".getBytes("utf-8")); } catch (IOException e) { e.printStackTrace(); } // `"--" + BOUNDARY + "--" + "rn"` String endLine = "--" + BOUNDARY + "--" + "rn"; try { bos.write(endLine.toString().getBytes("utf-8")); } catch (IOException e) { e.printStackTrace(); } Log.v("upLoad", "=====formImage====n" + bos.toString()); return bos.toByteArray(); } // `"--" + BOUNDARY + "rn"` sb.append("--" + BOUNDARY + "rn"); // Content-Disposition: form-data; name="text" + "rn" sb.append("Content-Disposition: form-data;"); sb.append(" name=""); sb.append("text"); sb.append("""); sb.append("rn"); // "rn" 空白的一行 sb.append("rn"); // 文本内容 sb.append(content); sb.append("rn"); if (mImage == null) { // `"--" + BOUNDARY + "--" + "rn"` String endLine = "--" + BOUNDARY + "--" + "rn"; try { bos.write(sb.toString().getBytes("utf-8")); bos.write(endLine.toString().getBytes("utf-8")); } catch (IOException e) { e.printStackTrace(); } Log.v("upLoad", "=====formImage====n" + bos.toString()); return bos.toByteArray(); } else { // `"--" + BOUNDARY + "rn"` sb.append("--" + BOUNDARY + "rn"); // Content-Disposition: form-data; name="参数的名称"; filename="上传的文件名" + // "rn" sb.append("Content-Disposition: form-data;"); sb.append(" name=""); sb.append(mImage.getName()); sb.append("""); sb.append("; filename=""); sb.append(mImage.getFileName()); sb.append("""); sb.append("rn"); // Content-Type: 文件的 mime 类型 + "rn" sb.append("Content-Type: "); sb.append(mImage.getMime()); sb.append("rn"); // "rn" 空白的一行 sb.append("rn"); try { bos.write(sb.toString().getBytes("utf-8")); // 文件的二进制数据 + "rn" bos.write(mImage.getValue()); bos.write("rn".getBytes("utf-8")); } catch (IOException e) { e.printStackTrace(); } } // `"--" + BOUNDARY + "--" + "rn"` String endLine = "--" + BOUNDARY + "--" + "rn"; try { bos.write(endLine.toString().getBytes("utf-8")); } catch (IOException e) { e.printStackTrace(); } Log.v("upLoad", "=====formImage====n" + bos.toString()); return bos.toByteArray(); } // Content-Type: multipart/form-data; boundary=----------8888888888888 @Override public String getBodyContentType() { return MULTIPART_FORM_DATA + "; boundary=" + BOUNDARY; } }
实例
RequestQueue mQueue = SingleRequestQueue.getRequestQueue();
FormImage image;
if (imageUri != null) {
Bitmap bitmap = null;
try {// 将路径转化成bitmap
bitmap=BitmapFactory.decodeStream(
getContentResolver().openInputStream(imageUri));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
image = new FormImage(bitmap);
} else
image = null;
PostUploadRequest post = new PostUploadRequest(C.api.userIcon, null, image,
new Response.Listener() {
@Override
public void onResponse(JSonObject jsonObject) {
try {
//TODO
} catch (JSonException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("VolleyError", error.getMessage(), error);
}
});
if (!customer.getcookie().equals("")) {
// 向服务器发起post请求时加上cookie字段
post.setSendcookie(customer.getcookie());
}
mQueue.add(post);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。



