Android使用Volley实现上传文件功能
一个项目中用到的使用Volley上传头像文件的例子,供大家参考,具体内容如下
/** *Createdbywangshihuion2015/11/30. *上传文件 *url:..... method:post 参数:file 接口给的参数:file就是表单的key,传给mFilePartName; 这是个测试类,测试上传头像没有问题,适合只上传单个文件的场景 */ publicclassMultipartRequestextendsRequest{ privateStringmHeader; privateMap mMap; privateStringcookieFromResp=""; privateMap headerMap=newHashMap<>(); privateMultipartEntityentity=newMultipartEntity(); privatefinalResponse.Listener mListener; privatefinalFilemFilePart; privateStringmFilePartName; /** *@paramurl *@paramlistener *@paramerrorListener *@paramfile_name *@paramfile */ publicMultipartRequest(Stringurl,Response.Listener listener,Response.ErrorListenererrorListener,Stringfile_name,Filefile) { super(Method.POST,url,errorListener); mListener=listener; mFilePart=file; mFilePartName=file_name; buildMultipartEntity(); } /** *添加文件参数 */ privatevoidbuildMultipartEntity() { entity.addPart(mFilePartName,newFileBody(mFilePart)); } @Override publicStringgetBodyContentType() { returnentity.getContentType().getValue(); } @Override publicbyte[]getBody()throwsAuthFailureError { ByteArrayOutputStreambos=newByteArrayOutputStream(); try { entity.writeTo(bos); } catch(IOExceptione) { VolleyLog.e("IOExceptionwritingtoByteArrayOutputStream"); } returnbos.toByteArray(); } /** *@paramresponse *@return */ @Override protectedResponse parseNetworkResponse(NetworkResponseresponse) { try{ JSONObjectjsonObject; System.out.println(response.headers.toString()); if(response.data.length!=0){ StringjsonString=newString(response.data,HttpHeaderParser.parseCharset(response.headers)); jsonObject=newJSONObject(jsonString); }else{ jsonObject=newJSONObject(); } //获取数据头 mHeader=response.headers.toString(); //提取Cookie(JSESSIONID) Patternpattern=Pattern.compile("Set-Cookie=.*?;"); Matchermatcher=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); returnResponse.success(jsonObject, HttpHeaderParser.parseCacheHeaders(response)); }catch(UnsupportedEncodingExceptione){ returnResponse.error(newParseError(e)); }catch(JSONExceptionje){ returnResponse.error(newParseError(je)); } } /** *@paramresponse */ @Override protectedvoiddeliverResponse(JSONObjectresponse) { mListener.onResponse(response); } @Override protectedMap getParams()throwsAuthFailureError{ returnmMap; } /** *@return *@throwsAuthFailureError */ @Override publicMap getHeaders()throwsAuthFailureError{ returnheaderMap; } /** *@return */ @Override publicRetryPolicygetRetryPolicy(){ RetryPolicyretryPolicy=newDefaultRetryPolicy(5000,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); returnretryPolicy; } /** *@paramcookie */ //将Cookie加入数据头 publicvoidsetSendCookie(Stringcookie){ headerMap.put("Cookie",cookie); } }
调用方法如下:
//指定url路径 Stringurl="http://182.92....."; MultipartRequestmultipartRequest=newMultipartRequest( url,newResponse.Listener(){ @Override publicvoidonResponse(JSONObjectresponse){ saveSessionID(response); } },newResponse.ErrorListener(){ @Override publicvoidonErrorResponse(VolleyErrore){ Log.e(TAG,e.getMessage(),e); try{ byte[]htmlBodyBytes=e.networkResponse.data; Log.e(TAG,newString(htmlBodyBytes),e); }catch(Exceptione1){ e1.printStackTrace(); } ToastUtil.showShortToast(UserCenterActivity.this,"网络连接异常"); } },"file",mSelectedPictureFile); multipartRequest.setSendCookie(loadSessionID()); multipartRequest.setTag(TAG); client.addTask(multipartRequest);
privateFilemSelectedPictureFile;
mSelectedPictureFile是一个File文件,参数名是file
通信成功保存Cookie
saveSessionID(response);
发送请求上传cookie
multipartRequest.setSendCookie(loadSessionID());
client是一个Volley的简单封装
protectedAsynHttpClientclient;
publicclassAsynHttpClient{ //volley的请求队列 privateRequestQueuerequestQueue; //保证全局变量是单一的 privatestaticAsynHttpClientinstance; privateContextmContext; privateAsynHttpClient(Contextcontext){ requestQueue=Volley.newRequestQueue(context); this.mContext=context; } /** *单列模式,让AsynHttpClient在整个项目中保持只有一个 *@paramcontext *@return */ publicstaticAsynHttpClientgetInstance(Contextcontext){ if(instance==null){ synchronized(AsynHttpClient.class){ if(instance==null){ instance=newAsynHttpClient(context); } } } returninstance; } /** *添加任务到volley的请求队列中去,并不会立即执行 *@paramtask */ publicvoidaddTask(Requesttask){ requestQueue.add(task); } publicRequestQueuegetRequestQueue(){ returnrequestQueue; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。