国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android使用Volley框架定制PostUploadRequest上傳文件

2019-10-21 21:31:38
字體:
來源:轉載
供稿:網友

發現問題

項目中有發表動態的功能,該功能可以將文本和圖片上傳至服務器。 
Volley通過定制PostUploadRequest實現文件上傳的功能,本文以一張圖片上傳為例。

數據格式

以下為項目中圖片上傳實例的數據格式 
多張圖片上傳可通過添加——WebKitFormBoundary 內容實現

POST /CloudLife/user/social HTTP/1.1Host: localhostConnection: keep-aliveCache-Control: max-age=0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Origin: http://localhostUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryzayymBT8Owg2UzBRReferer: http://localhost/CloudLife/upload.jspAccept-Encoding: gzip,deflate,sdchAccept-Language: zh-CN,zh;q=0.8Cookie: CLOUD_LIFE=03F21B9A9D9B4FF2BF443290A9CD8E2C; USER=18060506304; JSESSIONID=C4AB532929FA43230FA193A98197F962Content-Length: 12444------WebKitFormBoundaryzayymBT8Owg2UzBRContent-Disposition: form-data; name="text"發表的圈子內容------WebKitFormBoundaryzayymBT8Owg2UzBRContent-Disposition: form-data; name="file"; filename="這里是文件名"Content-Type: image/png這里空一行 接下來是二進制圖片文件內容------WebKitFormBoundaryzayymBT8Owg2UzBR--這里為空白的一行

總共有加上結尾行,有五行,圖片的二進制數,整個算一行;下面來分析下: 

1、第一行:”–” + boundary + “/r/n” ; 
文件上傳在提交數據的開始標志不變; 

2、第二行:Content-Disposition: form-data; name=”參數的名稱”; filename=”上傳的文件名” + “/r/n” 

3、第三行:Content-Type: 文件的 mime 類型 + “/r/n” 
這一行是文件上傳必須要的,而普通的文字提交可有可無,mime 類型需要根據文檔查詢; 

4、第四行:”/r/n” 

5、第五行文件的二進制數據 + “/r/n”: 
結尾行:”–” + boundary + “–” + “/r/n” 
可以同時上傳多個文件,上傳多個文件的時候重復1、2、3、4、5步,在最后的一個文件的末尾加上統一的結束行。

上傳的圖像實體類

import java.io.ByteArrayOutputStream;import android.graphics.Bitmap;/* * 上傳的圖像實體類 * */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;/* * 發送文件的volley  * post請求 Cookie * */public class PostUploadRequest extends Request<JSONObject> { private Map<String, String> sendHeader = new HashMap<String, String>(); // 正確數據的時候回掉用 private Response.Listener<JSONObject> 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<JSONObject> 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)); } /* * 這里開始解析數據 * @param response *  Response from the network * @return * */ @Override protected Response<JSONObject> 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)); } } /* * 回調正確的數據 * @param response *  The parsed response returned by * */ @Override protected void deliverResponse(JSONObject response) { mListener.onResponse(response); } @Override public Map<String, String> 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 + "/r/n"`  sb.append("--" + BOUNDARY + "/r/n");  /* 第二行 */  // Content-Disposition: form-data; name="參數的名稱"; filename="上傳的文件名" +  // "/r/n"  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("/r/n");  /* 第三行 */  // Content-Type: 文件的 mime 類型 + "/r/n"  sb.append("Content-Type: ");  sb.append(mImage.getMime());  sb.append("/r/n");  /* 第四行 */  // "/r/n" 空白的一行  sb.append("/r/n");  try {  bos.write(sb.toString().getBytes("utf-8"));  /* 第五行 */  // 文件的二進制數據 + "/r/n"  bos.write(mImage.getValue());  bos.write("/r/n".getBytes("utf-8"));  } catch (IOException e) {  e.printStackTrace();  }  /* 結尾行 */  // `"--" + BOUNDARY + "--" + "/r/n"`  String endLine = "--" + BOUNDARY + "--" + "/r/n";  try {  bos.write(endLine.toString().getBytes("utf-8"));  } catch (IOException e) {  e.printStackTrace();  }  Log.v("upLoad", "=====formImage====/n" + bos.toString());  return bos.toByteArray(); } /**  * 文字  */ /* 第一行 */ // `"--" + BOUNDARY + "/r/n"` sb.append("--" + BOUNDARY + "/r/n"); /* 第二行 */ // Content-Disposition: form-data; name="text" + "/r/n" sb.append("Content-Disposition: form-data;"); sb.append(" name=/""); sb.append("text"); sb.append("/""); sb.append("/r/n"); /* 第三行 */ // "/r/n" 空白的一行 sb.append("/r/n"); /* 第四行 */ // 文本內容 sb.append(content); sb.append("/r/n"); if (mImage == null) {  /* 結尾行 */  // `"--" + BOUNDARY + "--" + "/r/n"`  String endLine = "--" + BOUNDARY + "--" + "/r/n";  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 + "/r/n"`  sb.append("--" + BOUNDARY + "/r/n");  /* 第二行 */  // Content-Disposition: form-data; name="參數的名稱"; filename="上傳的文件名" +  // "/r/n"  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("/r/n");  /* 第三行 */  // Content-Type: 文件的 mime 類型 + "/r/n"  sb.append("Content-Type: ");  sb.append(mImage.getMime());  sb.append("/r/n");  /* 第四行 */  // "/r/n" 空白的一行  sb.append("/r/n");  try {  bos.write(sb.toString().getBytes("utf-8"));  /* 第五行 */  // 文件的二進制數據 + "/r/n"  bos.write(mImage.getValue());  bos.write("/r/n".getBytes("utf-8"));  } catch (IOException e) {  e.printStackTrace();  } } /* 結尾行 */ // `"--" + BOUNDARY + "--" + "/r/n"` String endLine = "--" + BOUNDARY + "--" + "/r/n"; 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<JSONObject>() { @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);

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宜春市| 邵武市| 沅陵县| 洛扎县| 利津县| 江油市| 泾川县| 玛多县| 亚东县| 万源市| 罗平县| 西畴县| 湖口县| 高尔夫| 龙州县| 永年县| 札达县| 景谷| 西华县| 广灵县| 资兴市| 温州市| 遵义市| 南投县| 乌兰察布市| 新兴县| 宜兰县| 奈曼旗| 二连浩特市| 绥芬河市| 彭泽县| 万荣县| 延庆县| 且末县| 察哈| 大方县| 积石山| 砀山县| 通江县| 阜康市| 南开区|