Android使用Volley實現(xiàn)上傳文件功能
一個項目中用到的使用Volley上傳頭像文件的例子,供大家參考,具體內(nèi)容如下
/** * Created by wangshihui on 2015/11/30. * 上傳文件 * url:..... method:post 參數(shù):file 接口給的參數(shù):file 就是表單的key,傳給mFilePartName; 這是個測試類,測試上傳頭像沒有問題,適合只上傳單個文件的場景 */ public class MultipartRequest extends Request<JSONObject> { private String mHeader; private Map<String, String> mMap; private String cookieFromResp = ""; private Map<String, String> headerMap = new HashMap<>(); private MultipartEntity entity = new MultipartEntity(); private final Response.Listener<JSONObject> mListener; private final File mFilePart; private String mFilePartName; /** * @param url * @param listener * @param errorListener * @param file_name * @param file */ public MultipartRequest(String url, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener, String file_name,File file) { super(Method.POST, url, errorListener); mListener = listener; mFilePart = file; mFilePartName=file_name; buildMultipartEntity(); } /** * 添加文件參數(shù) */ private void buildMultipartEntity() { entity.addPart(mFilePartName, new FileBody(mFilePart)); } @Override public String getBodyContentType() { return entity.getContentType().getValue(); } @Override public byte[] getBody() throws AuthFailureError { ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { entity.writeTo(bos); } catch (IOException e) { VolleyLog.e("IOException writing to ByteArrayOutputStream"); } return bos.toByteArray(); } /** * @param response * @return */ @Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { try { JSONObject jsonObject; System.out.println(response.headers.toString()); if (response.data.length != 0) { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); jsonObject = new JSONObject(jsonString); } else { jsonObject = new JSONObject(); } //獲取數(shù)據(jù)頭 mHeader = response.headers.toString(); //提取Cookie(JSESSIONID) Pattern pattern = Pattern.compile("Set-Cookie=.*?;"); Matcher matcher = pattern.matcher(mHeader); if (matcher.find()) { cookieFromResp = matcher.group(); cookieFromResp = cookieFromResp.substring(11, cookieFromResp.length() - 1); System.out.println("Cookie: " + cookieFromResp); } jsonObject.put("Cookie", cookieFromResp); 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 */ @Override protected void deliverResponse(JSONObject response) { mListener.onResponse(response); } @Override protected Map<String, String> getParams() throws AuthFailureError { return mMap; } /** * @return * @throws AuthFailureError */ @Override public Map<String, String> getHeaders() throws AuthFailureError { return headerMap; } /** * @return */ @Override public RetryPolicy getRetryPolicy() { RetryPolicy retryPolicy = new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); return retryPolicy; } /** * @param cookie */ //將Cookie加入數(shù)據(jù)頭 public void setSendCookie(String cookie) { headerMap.put("Cookie", cookie); } }
調(diào)用方法如下:
//指定url路徑 String url = "http://182.92....."; MultipartRequest multipartRequest = new MultipartRequest( url, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { saveSessionID(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError e) { Log.e(TAG, e.getMessage(), e); try { byte[] htmlBodyBytes = e.networkResponse.data; Log.e(TAG, new String(htmlBodyBytes), e); } catch (Exception e1) { e1.printStackTrace(); } ToastUtil.showShortToast(UserCenterActivity.this, "網(wǎng)絡(luò)連接異常"); } }, "file", mSelectedPictureFile); multipartRequest.setSendCookie(loadSessionID()); multipartRequest.setTag(TAG); client.addTask(multipartRequest);
private File mSelectedPictureFile;
mSelectedPictureFile是一個File文件,參數(shù)名是file
通信成功保存Cookie
saveSessionID(response);
發(fā)送請求上傳cookie
multipartRequest.setSendCookie(loadSessionID());
client是一個Volley的簡單封裝
protected AsynHttpClient client;
public class AsynHttpClient { //volley的請求隊列 private RequestQueue requestQueue; //保證全局變量是單一的 private static AsynHttpClient instance; private Context mContext; private AsynHttpClient(Context context) { requestQueue = Volley.newRequestQueue(context); this.mContext = context; } /** * 單列模式,讓AsynHttpClient在整個項目中保持只有一個 * @param context * @return */ public static AsynHttpClient getInstance(Context context) { if (instance==null){ synchronized (AsynHttpClient.class){ if (instance==null){ instance=new AsynHttpClient(context); } } } return instance; } /** * 添加任務(wù)到volley的請求隊列中去,并不會立即執(zhí)行 * @param task */ public void addTask(Request task){ requestQueue.add(task); } public RequestQueue getRequestQueue() { return requestQueue; } }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Android框架Volley之利用Imageloader和NetWorkImageView加載圖片的方法
- Android框架Volley使用之Post請求實現(xiàn)方法
- Android框架Volley使用之Json請求實現(xiàn)
- Android框架Volley使用:ImageRequest請求實現(xiàn)圖片加載
- Android中volley封裝實踐記錄(二)
- Android中volley封裝實踐記錄
- Android Volley擴展實現(xiàn)支持進度條的文件上傳功能
- Android使用Volley框架定制PostUploadRequest上傳文件
- 解析Android框架之Volley源碼
相關(guān)文章
實例講解Android應(yīng)用開發(fā)中TabHost的使用要點
這篇文章主要介紹了Android應(yīng)用開發(fā)中TabHost的使用要點,文中以實例講解了TabHost與Tab的布局方法,需要的朋友可以參考下2016-04-04Android開發(fā)listview選中高亮簡單實現(xiàn)代碼分享
這篇文章主要介紹了Android開發(fā)listview選中高亮簡單實現(xiàn)代碼分享,具有一定借鑒價值,需要的朋友可以參考下2018-01-01webview添加參數(shù)與修改請求頭的user-agent實例
這篇文章主要介紹了webview添加參數(shù)與修改請求頭的user-agent實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android開發(fā)之進度條ProgressBar的示例代碼
本篇文章主要介紹了Android開發(fā)之進度條ProgressBar的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03Gradle?Build?Cache引發(fā)的Task緩存編譯問題
這篇文章主要為大家介紹了Gradle?Build?Cache引發(fā)的Task緩存編譯問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06安卓Android6.0權(quán)限動態(tài)獲取操作示例
這篇文章主要介紹了安卓Android6.0權(quán)限動態(tài)獲取操作,結(jié)合實例形式分析了Android6.0針對權(quán)限的動態(tài)獲取、授權(quán)等相關(guān)操作技巧,需要的朋友可以參考下2018-02-02