栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android使用Volley框架定制PostUploadRequest上传文件

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android使用Volley框架定制PostUploadRequest上传文件

发现问题

项目中有发表动态的功能,该功能可以将文本和图片上传至服务器。
Volley通过定制PostUploadRequest实现文件上传的功能,本文以一张图片上传为例。

数据格式

以下为项目中图片上传实例的数据格式
多张图片上传可通过添加——WebKitFormBoundary 内容实现

POST /CloudLife/user/social HTTP/1.1
Host: localhost
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*
public class FormImage {

 // 参数的名称
 private String mName;

 // 文件名
 private String mFileName;

 // 文件的 mime,需要根据文档查询
 private String mMime;

 // 需要上传的图片资源,因为这里测试为了方便起见,直接把 bitmap 传进来,真正在项目中一般不会这般做,
 // 而是把图片的路径传过来,在这里对图片进行二进制转换
 private Bitmap mBitmap = null;

 public FormImage(Bitmap bitmap) {
 this.mBitmap = bitmap;
 }

 public String getName() {
 return "file";
 }

 public String getFileName() {
 return "add.png";
 }

 // 对图片进行二进制转换
 public byte[] getValue() {
 ByteArrayOutputStream bos = new ByteArrayOutputStream();
 mBitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);
 return bos.toByteArray();
 }

 // 因为我知道是 png 文件,所以直接根据文档查的
 public String getMime() {
 return "image/png";
 }
}

定制PostUploadRequest

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.protocol.HTTP;
import org.json.JSONException;
import org.json.JSONObject;

import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.toolbox.HttpHeaderParser;

import android.util.Log;


public class PostUploadRequest extends Request {

 private Map sendHeader = new HashMap();

 // 正确数据的时候回掉用
 private Response.Listener mListener;

 // 请求 数据通过参数的形式传入 
 private String content;
 private FormImage mImage;

 // 数据分隔线
 private String BOUNDARY = "----CloudLifeUpLoadImage"; 
 private String MULTIPART_FORM_DATA = "multipart/form-data";

 public PostUploadRequest(String url, String text, FormImage Item, Response.Listener listener,Response.ErrorListener errorListener) {

 super(Method.POST, url, errorListener);
 this.mListener = listener;
 setShouldCache(false);
 mImage = Item;
 content = text;

 // 设置请求的响应事件,因为文件上传需要较长的时间,所以在这里加大了,设为5秒
 setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
  DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
 }

 
 @Override
 protected Response parseNetworkResponse(NetworkResponse response) {
 try {
  // 防止中文乱码
  @SuppressWarnings("deprecation")
  String jsonString = new String(response.data, HTTP.UTF_8);

  JSonObject jsonObject = new JSonObject(jsonString);

  Log.w("upLoad", "jsonObject " + jsonObject.toString());

  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));
 }
 }

 
 @Override
 protected void deliverResponse(JSonObject response) {
 mListener.onResponse(response);
 }

 @Override
 public Map getHeaders() throws AuthFailureError {
 return sendHeader;
 }

 public void setSendcookie(String cookie) {
 sendHeader.put("cookie", cookie);
 }

 @Override
 public byte[] getBody() throws AuthFailureError {
 ByteArrayOutputStream bos = new ByteArrayOutputStream();

 StringBuffer sb = new StringBuffer();

 if (content == null) {
  
  
  // `"--" + BOUNDARY + "rn"`
  sb.append("--" + BOUNDARY + "rn");

  
  // Content-Disposition: form-data; name="参数的名称"; filename="上传的文件名" +
  // "rn"
  sb.append("Content-Disposition: form-data;");
  sb.append(" name="");
  sb.append(mImage.getName());
  sb.append(""");
  sb.append("; filename="");
  sb.append(mImage.getFileName());
  sb.append(""");
  sb.append("rn");

  
  // Content-Type: 文件的 mime 类型 + "rn"
  sb.append("Content-Type: ");
  sb.append(mImage.getMime());
  sb.append("rn");

  
  // "rn" 空白的一行
  sb.append("rn");

  try {
  bos.write(sb.toString().getBytes("utf-8"));
  
  // 文件的二进制数据 + "rn"
  bos.write(mImage.getValue());
  bos.write("rn".getBytes("utf-8"));
  } catch (IOException e) {
  e.printStackTrace();
  }

  
  // `"--" + BOUNDARY + "--" + "rn"`
  String endLine = "--" + BOUNDARY + "--" + "rn";
  try {
  bos.write(endLine.toString().getBytes("utf-8"));
  } catch (IOException e) {
  e.printStackTrace();
  }
  Log.v("upLoad", "=====formImage====n" + bos.toString());
  return bos.toByteArray();
 }
 
 
 // `"--" + BOUNDARY + "rn"`
 sb.append("--" + BOUNDARY + "rn");

 
 // Content-Disposition: form-data; name="text" + "rn"
 sb.append("Content-Disposition: form-data;");
 sb.append(" name="");
 sb.append("text");
 sb.append(""");
 sb.append("rn");

 
 // "rn" 空白的一行
 sb.append("rn");

 
 // 文本内容
 sb.append(content);
 sb.append("rn");

 if (mImage == null) {
  
  // `"--" + BOUNDARY + "--" + "rn"`
  String endLine = "--" + BOUNDARY + "--" + "rn";
  try {
  bos.write(sb.toString().getBytes("utf-8"));
  bos.write(endLine.toString().getBytes("utf-8"));
  } catch (IOException e) {
  e.printStackTrace();
  }
  Log.v("upLoad", "=====formImage====n" + bos.toString());
  return bos.toByteArray();
 } else {
  
  
  // `"--" + BOUNDARY + "rn"`
  sb.append("--" + BOUNDARY + "rn");

  
  // Content-Disposition: form-data; name="参数的名称"; filename="上传的文件名" +
  // "rn"
  sb.append("Content-Disposition: form-data;");
  sb.append(" name="");
  sb.append(mImage.getName());
  sb.append(""");
  sb.append("; filename="");
  sb.append(mImage.getFileName());
  sb.append(""");
  sb.append("rn");

  
  // Content-Type: 文件的 mime 类型 + "rn"
  sb.append("Content-Type: ");
  sb.append(mImage.getMime());
  sb.append("rn");

  
  // "rn" 空白的一行
  sb.append("rn");

  try {
  bos.write(sb.toString().getBytes("utf-8"));
  
  // 文件的二进制数据 + "rn"
  bos.write(mImage.getValue());
  bos.write("rn".getBytes("utf-8"));
  } catch (IOException e) {
  e.printStackTrace();
  }

 }

 
 // `"--" + BOUNDARY + "--" + "rn"`
 String endLine = "--" + BOUNDARY + "--" + "rn";
 try {
  bos.write(endLine.toString().getBytes("utf-8"));
 } catch (IOException e) {
  e.printStackTrace();
 }
 Log.v("upLoad", "=====formImage====n" + bos.toString());
 return bos.toByteArray();
 }

 // Content-Type: multipart/form-data; boundary=----------8888888888888
 @Override
 public String getBodyContentType() {
 return MULTIPART_FORM_DATA + "; boundary=" + BOUNDARY;
 }
}

实例

RequestQueue mQueue = SingleRequestQueue.getRequestQueue();

FormImage image;
if (imageUri != null) {
 Bitmap bitmap = null;
 try {// 将路径转化成bitmap
 bitmap=BitmapFactory.decodeStream(
  getContentResolver().openInputStream(imageUri));
 } catch (FileNotFoundException e1) {
 e1.printStackTrace();
 }
 image = new FormImage(bitmap);
} else
 image = null;

PostUploadRequest post = new PostUploadRequest(C.api.userIcon, null, image,
 new Response.Listener() {
 @Override
 public void onResponse(JSonObject jsonObject) {
  try {
  //TODO
  } catch (JSonException e) {
  e.printStackTrace();
  }
 }
 }, new Response.ErrorListener() {
 @Override
 public void onErrorResponse(VolleyError error) {
  Log.e("VolleyError", error.getMessage(), error);
 }
 });

if (!customer.getcookie().equals("")) {
 // 向服务器发起post请求时加上cookie字段
 post.setSendcookie(customer.getcookie());
}

mQueue.add(post);

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/155141.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号