溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android使用Volley實(shí)現(xiàn)上傳文件功能

發(fā)布時(shí)間:2020-09-30 16:02:00 來(lái)源:腳本之家 閱讀:122 作者:王世暉 欄目:移動(dòng)開(kāi)發(fā)

一個(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í)有所幫助,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI