Android使用Volley實(shí)現(xiàn)上傳文件功能
一個(gè)項(xiàng)目中用到的使用Volley上傳頭像文件的例子,供大家參考,具體內(nèi)容如下
/**
* Created by wangshihui on 2015/11/30.
* 上傳文件
* url:.....
method:post
參數(shù):file
接口給的參數(shù):file 就是表單的key,傳給mFilePartName;
這是個(gè)測(cè)試類(lèi),測(cè)試上傳頭像沒(méi)有問(wèn)題,適合只上傳單個(gè)文件的場(chǎng)景
*/
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是一個(gè)File文件,參數(shù)名是file
通信成功保存Cookie
saveSessionID(response);
發(fā)送請(qǐng)求上傳cookie
multipartRequest.setSendCookie(loadSessionID());
client是一個(gè)Volley的簡(jiǎn)單封裝
protected AsynHttpClient client;
public class AsynHttpClient {
//volley的請(qǐng)求隊(duì)列
private RequestQueue requestQueue;
//保證全局變量是單一的
private static AsynHttpClient instance;
private Context mContext;
private AsynHttpClient(Context context) {
requestQueue = Volley.newRequestQueue(context);
this.mContext = context;
}
/**
* 單列模式,讓AsynHttpClient在整個(gè)項(xiàng)目中保持只有一個(gè)
* @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的請(qǐng)求隊(duì)列中去,并不會(huì)立即執(zhí)行
* @param task
*/
public void addTask(Request task){
requestQueue.add(task);
}
public RequestQueue getRequestQueue() {
return requestQueue;
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android框架Volley之利用Imageloader和NetWorkImageView加載圖片的方法
- Android框架Volley使用之Post請(qǐng)求實(shí)現(xiàn)方法
- Android框架Volley使用之Json請(qǐng)求實(shí)現(xiàn)
- Android框架Volley使用:ImageRequest請(qǐng)求實(shí)現(xiàn)圖片加載
- Android中volley封裝實(shí)踐記錄(二)
- Android中volley封裝實(shí)踐記錄
- Android Volley擴(kuò)展實(shí)現(xiàn)支持進(jìn)度條的文件上傳功能
- Android使用Volley框架定制PostUploadRequest上傳文件
- 解析Android框架之Volley源碼
相關(guān)文章
實(shí)例講解Android應(yīng)用開(kāi)發(fā)中TabHost的使用要點(diǎn)
這篇文章主要介紹了Android應(yīng)用開(kāi)發(fā)中TabHost的使用要點(diǎn),文中以實(shí)例講解了TabHost與Tab的布局方法,需要的朋友可以參考下2016-04-04
Android開(kāi)發(fā)listview選中高亮簡(jiǎn)單實(shí)現(xiàn)代碼分享
這篇文章主要介紹了Android開(kāi)發(fā)listview選中高亮簡(jiǎn)單實(shí)現(xiàn)代碼分享,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Android實(shí)現(xiàn)淘寶底部圖標(biāo)導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)淘寶底部圖標(biāo)導(dǎo)航欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
Android獲取手機(jī)系統(tǒng)版本等信息的方法
這篇文章主要介紹了Android獲取手機(jī)系統(tǒng)版本等信息的方法,涉及Android獲取手機(jī)版本中各種常見(jiàn)信息的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
webview添加參數(shù)與修改請(qǐng)求頭的user-agent實(shí)例
這篇文章主要介紹了webview添加參數(shù)與修改請(qǐng)求頭的user-agent實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
Android開(kāi)發(fā)之進(jìn)度條ProgressBar的示例代碼
本篇文章主要介紹了Android開(kāi)發(fā)之進(jìn)度條ProgressBar的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Gradle?Build?Cache引發(fā)的Task緩存編譯問(wèn)題
這篇文章主要為大家介紹了Gradle?Build?Cache引發(fā)的Task緩存編譯問(wèn)題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
安卓Android6.0權(quán)限動(dòng)態(tài)獲取操作示例
這篇文章主要介紹了安卓Android6.0權(quán)限動(dòng)態(tài)獲取操作,結(jié)合實(shí)例形式分析了Android6.0針對(duì)權(quán)限的動(dòng)態(tài)獲取、授權(quán)等相關(guān)操作技巧,需要的朋友可以參考下2018-02-02
Android實(shí)現(xiàn)背景顏色滑動(dòng)漸變效果的全過(guò)程
在Android開(kāi)發(fā)中,經(jīng)常需要設(shè)置控件的背景顏色或者圖片的src顏色,下面這篇文章主要給大家介紹了關(guān)于Android實(shí)現(xiàn)背景顏色滑動(dòng)漸變效果的相關(guān)資料,本文通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
Android項(xiàng)目開(kāi)發(fā)之UI設(shè)計(jì)器
這篇文章主要為大家詳細(xì)介紹了Android項(xiàng)目開(kāi)發(fā)之UI設(shè)計(jì)器,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06

