亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > 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開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产在线精品成人一区二区三区| 亚洲第一色在线| 欧美午夜性色大片在线观看| 国产精品网站视频| 久久网福利资源网站| 日韩中文字幕在线看| 亚洲人成在线免费观看| 日韩最新免费不卡| 日韩二区三区在线| 91亚洲精品在线观看| 黄色精品在线看| 91视频免费在线| 亚洲日本中文字幕| 成人免费看黄网站| 亚洲精品xxx| 国产精品老女人视频| 亚洲xxxx3d| 国产亚洲一区二区在线| 国产成人精品视频在线观看| 精品一区二区三区三区| 久久av资源网站| 91亚洲国产成人久久精品网站| 久热精品视频在线| 日韩在线中文字幕| 亚洲高清在线观看| 日韩成人性视频| 欧美性猛交xxx| 日韩中文字幕网| 成人啪啪免费看| yw.139尤物在线精品视频| 亚洲电影成人av99爱色| 亚洲va男人天堂| 亚洲一区二区中文| 亚洲精品视频在线观看视频| 国产精品福利网| 日韩有码在线电影| 成人在线激情视频| 国产日韩欧美一二三区| 国产又爽又黄的激情精品视频| 黑丝美女久久久| 蜜月aⅴ免费一区二区三区| 欧美尺度大的性做爰视频| 日韩精品极品毛片系列视频| 国产精品一区二区av影院萌芽| 亚洲乱亚洲乱妇无码| 国产亚洲精品久久久久久| 日本精品久久中文字幕佐佐木| 欧美电影免费观看网站| 一区二区在线视频| 在线电影欧美日韩一区二区私密| 懂色aⅴ精品一区二区三区蜜月| 久久精品这里热有精品| 麻豆国产精品va在线观看不卡| 欧洲美女7788成人免费视频| 亚洲精品天天看| 亚洲视频在线观看免费| 欧美一区二区.| 日韩av一区在线观看| 欧美激情成人在线视频| 97视频在线观看免费| 日韩av在线最新| 97视频免费在线看| 国产在线999| 国产日韩中文在线| 色哟哟网站入口亚洲精品| 久久成人18免费网站| 久久免费视频网| 精品久久在线播放| 国语自产在线不卡| 91免费看视频.| 不卡伊人av在线播放| 久色乳综合思思在线视频| 色黄久久久久久| 最近2019好看的中文字幕免费| 伊人伊成久久人综合网小说| 好吊成人免视频| 日韩最新免费不卡| 性欧美xxxx视频在线观看| 91精品久久久久久久久久入口| 日韩的一区二区| 国产精品99蜜臀久久不卡二区| 国产精品盗摄久久久| 中文字幕欧美精品日韩中文字幕| 97视频免费观看| 亚洲一区二区三区四区在线播放| 国产精品久久久久久亚洲调教| 日韩成人高清在线| 国内精品久久久久伊人av| 欧美美女18p| 国语自产精品视频在线看抢先版图片| 国产精品久久久久7777婷婷| 精品国产区一区二区三区在线观看| 欧美xxxx14xxxxx性爽| 亚洲精品电影网| 色偷偷综合社区| 久久久久久久久亚洲| 日韩视频欧美视频| 国产精品专区一| 欧美成人激情视频| 日日摸夜夜添一区| 成人综合国产精品| 在线精品91av| 亚洲无亚洲人成网站77777| 亚洲欧美一区二区激情| 亚洲午夜女主播在线直播| 亚洲美女中文字幕| 国产精品美女呻吟| 成人欧美在线视频| 亚洲国产美女久久久久| 欧美噜噜久久久xxx| 另类视频在线观看| 亚洲成人a级网| 91久久久久久久久久| 欧美激情国产精品| 欧美日韩国产综合新一区| 亚洲精品久久久久久久久久久| www高清在线视频日韩欧美| 亚洲a成v人在线观看| 538国产精品一区二区在线| 欧美另类极品videosbest最新版本| 国产精品免费福利| 国产精品午夜国产小视频| 久久久国产一区| 日韩精品中文字幕在线播放| 国产999精品久久久| 国产视频丨精品|在线观看| 欧美xxxx做受欧美.88| 91成品人片a无限观看| 国产亚洲成av人片在线观看桃| 国产成人精品免高潮在线观看| 欧美极品美女视频网站在线观看免费| 日韩av免费在线| 在线精品国产欧美| 国产精品午夜国产小视频| 亚洲一区二区中文字幕| 亚洲欧美变态国产另类| 亚洲精品免费av| 成人久久一区二区| 69**夜色精品国产69乱| 亚洲性xxxx| 国产成人精品免高潮在线观看| 亚洲男人天堂手机在线| 国产精品亚洲视频在线观看| 国产精品日韩欧美综合| 亚洲一区二区三区乱码aⅴ| 国产成人亚洲综合91| 色婷婷**av毛片一区| 久久99精品久久久久久琪琪| 亚洲人成免费电影| 91亚洲午夜在线| 精品国内亚洲在观看18黄| 在线成人激情黄色| 91av在线国产| 日韩欧中文字幕| 欧美成人全部免费| 欧美日韩加勒比精品一区| 91久久综合亚洲鲁鲁五月天| 亚洲欧美色图片| 亚洲夜晚福利在线观看| 欧美三级xxx| 亚洲香蕉av在线一区二区三区| 国产精品视频1区| 亚洲欧美日韩国产中文专区| 亚洲娇小xxxx欧美娇小|