我是靠谱客的博主 单身音响,这篇文章主要介绍Android使用Volley实现上传文件功能,现在分享给大家,希望可以做个参考。

一个项目中用到的使用Volley上传头像文件的例子,供大家参考,具体内容如下

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/** * Created by wangshihui on 2015/11/30. * 上传文件 * url:..... method:post 参数:file 接口给的参数: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(); } /** * 添加文件参数 */ 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(); } //获取数据头 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加入数据头 public void setSendCookie(String cookie) { headerMap.put("Cookie", cookie); } }

调用方法如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//指定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, "网络连接异常"); } }, "file", mSelectedPictureFile); multipartRequest.setSendCookie(loadSessionID()); multipartRequest.setTag(TAG); client.addTask(multipartRequest);

private File mSelectedPictureFile;
mSelectedPictureFile是一个File文件,参数名是file

通信成功保存Cookie

saveSessionID(response);  

发送请求上传cookie

multipartRequest.setSendCookie(loadSessionID());

client是一个Volley的简单封装

protected AsynHttpClient client;

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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; } /** * 添加任务到volley的请求队列中去,并不会立即执行 * @param task */ public void addTask(Request task){ requestQueue.add(task); } public RequestQueue getRequestQueue() { return requestQueue; } }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持靠谱客。

最后

以上就是单身音响最近收集整理的关于Android使用Volley实现上传文件功能的全部内容,更多相关Android使用Volley实现上传文件功能内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(108)

评论列表共有 0 条评论

立即
投稿
返回
顶部