服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android使用Volley实现上传文件功能

Android使用Volley实现上传文件功能

2022-09-07 15:45王世晖 Android

这篇文章主要介绍了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;
  }
}

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

原文链接:https://blog.csdn.net/wangshihui512/article/details/50791324

延伸 · 阅读

精彩推荐