Volley学习(五)HttpUrlConnection、Volley 2种方式实现头像上传

来源:互联网 发布:珠海java培训学校 编辑:程序博客网 时间:2024/05/21 09:16

点击链接,免积分下载,点击链接,免积分下载


Volley学习(一)Android Volley源码解析
Volley学习(二)简封Volley、为Volley请求头体添加Json参数、Gson和JsonObject生成Json数据、Gson解析返回的Json
Volley学习(三)ImageRequest、ImageLoader、NetworkImageView源码简读
Volley学习(四)NetworkImageView+LruCache(源码简读)图片请求小例子

这篇博客是来了解下,头像上传如何实现,我们httpurlconnection和Volley来实现

首先了解下布局文件
这里写图片描述

我们先看httpurl如何实现头像上传的?

头像上传其实本质上就是将某个需要上传的图片转为byte[]数组,然后在通过Base64.encodeToString转为字符串
首先添加头部体部分,用来生成json字符串,这里说一下,我们公司是直接拼接的方式,当然你也可以用fastson、Gson、JsonObject来生成json格式

/**     * 生成数据上传的头部,需要数据国鼎id,应用类型,操作系统类型     */    private void addUserInfosHead() {        headParameters.clear();        headParameters.add("godin_id", "0e6ad2a71e31752deb69d6e8c9eabe76");        headParameters.add("app_type", "3");        headParameters.add("os_type", "android");    }    /**     * 生成数据上传的数据包体     */    private void addRequestBodyInfos() {        bodyParameters.clear();        bodyParameters.add("photo_type", "jpeg");        bodyParameters.add("context",                Base64.encodeToString(bitmap2Bytes, Base64.DEFAULT));        bodyParameters.add("nickname", nick_name.getText().toString());    }

楼上的Base64.encodeToString(bitmap2Bytes, Base64.DEFAULT)就是将图片的二进制文件转为字符串

我们公司的封装代码中,以下代码就是生成json格式

requestion = ProtocolUtil.buildJSONPacketBody(headParameters,                bodyParameters);

看看Json格式把:
这里写图片描述

然后就是点击上传即可,我用的网络请求是https的,所以在initHttps中进行一些证书的认证之类的,然后就打开网络链接conn,然后就获取相应码即可

initHttps();              URL url = new URL(urlString);            HttpURLConnection conn = (HttpURLConnection) url.openConnection();            conn.setConnectTimeout(5000);            conn.setDoOutput(true);//设置允许输出            conn.setRequestMethod("POST");            conn.setRequestProperty("User-Agent", "Fiddler");            conn.setRequestProperty("Content-Type", "application/json");            conn.setRequestProperty("Charset", "utf-8");            OutputStream os = conn.getOutputStream();            os.write(content.getBytes());            os.close();            /*服务器返回的响应码*/            int code = conn.getResponseCode();            if (code == 200) {                Log.d("Evelyn", "response code:" + code);            }            conn.disconnect();

最后看返回结果即可
这里写图片描述

我们再看看Volley如何实现头像上传的?
之前的几篇博客中,有对volley、Gson的封装使用,本篇博客就简单使用即可

            StringRequest request = new StringRequest(Method.POST,                    url,                    new Listener<String>() {                        @Override                        public void onResponse(String arg0) {                            Log.e("TAG", "volley onResponse--->>" + arg0);                            /**                             * {"Response":{"head":{"statuscode":"000000",                             * "statusmsg":"sucess"}}}                             */                        }                    }, new Response.ErrorListener() {                        @Override                        public void onErrorResponse(VolleyError arg0) {                        }                    }) {                @Override                public byte[] getBody() throws AuthFailureError {                    return requestStringBytes;                }                @Override                public String getBodyContentType() {                    return String.format(                            "application/x-www-form-urlencoded; charset=%s",                            "utf-8");                }                @Override                public Map<String, String> getHeaders() throws AuthFailureError {                    Map<String, String> headers = new HashMap<String, String>();                    headers.put("Charset", "UTF-8");                    headers.put("Content-Type", "application/x-javascript");                    headers.put("Accept-Encoding", "gzip,deflate");                    return headers;                }            };            // 设置标签            queue.add(request);            queue.start();

代码也很简单;
getBodyContentType这里是设置请求的东东的格式化
getHeaders这里也是设置一些需要的参数(我当时也是搜的百度,么有这些设置,无法相应正确返回值)

@Override                public byte[] getBody() throws AuthFailureError {                    return requestStringBytes;                }

这个就是需要的body[] 我们就用httpurlconnect中的那个json字符串即可

requestStringBytes = requestion.getBytes("UTF-8");

然后一样接受返回值即可,如下截图是本公司返回的json格式
这里写图片描述


////////////////////////////////以下是代码区//////////////////////////////////////////////////////////////
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.example.uploadphoto2server.MainActivity" >    <TextView        android:id="@+id/nick_name"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world" />    <ImageView        android:id="@+id/image"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@drawable/ic_launcher" />    <Button        android:text="httpurlconnection头像上传"        android:id="@+id/upload"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />     <Button         android:id="@+id/uploadByvolley"        android:text="volley头像上传"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></LinearLayout>

MainActivity这个类中我将url屏蔽了,因为是公司上线项目,不方便,呵呵

package com.example.uploadphoto2server;import java.io.ByteArrayOutputStream;import java.io.UnsupportedEncodingException;import java.util.HashMap;import java.util.Map;import android.app.Activity;import android.content.res.Resources;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.util.Base64;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;import android.widget.TextView;import com.android.volley.AuthFailureError;import com.android.volley.Request.Method;import com.android.volley.RequestQueue;import com.android.volley.Response;import com.android.volley.Response.Listener;import com.android.volley.VolleyError;import com.android.volley.toolbox.StringRequest;import com.android.volley.toolbox.Volley;import com.google.gson.Gson;public class MainActivity extends Activity implements OnClickListener {    TextView nick_name;    ImageView image;    Button upload, uploadByvolley;    private JsonParameters headParameters;    private JsonParameters bodyParameters;    private DataToServer userInfosToServer;    private byte[] bitmap2Bytes;    public RequestQueue queue;    private String requestion;    private byte[] requestStringBytes;    String url = "https://10.0.5.48:7771/xxxxxx";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //volley队列        queue = Volley.newRequestQueue(this);        //昵称        nick_name = (TextView) findViewById(R.id.nick_name);        //头像        image = (ImageView) findViewById(R.id.image);        //httpurlconnection上传头像、昵称        upload = (Button) findViewById(R.id.upload);        //volley上传头像、昵称        uploadByvolley = (Button) findViewById(R.id.uploadByvolley);        upload.setOnClickListener(this);        uploadByvolley.setOnClickListener(this);        //用来封装 请求头体        headParameters = new JsonParameters();        bodyParameters = new JsonParameters();        /**         * 获取头像的二进制码文件         */        Resources res = getResources();        Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.ic_launcher);        bitmap2Bytes = Bitmap2Bytes(bmp);        /*         * 添加请求头,请求体----这是公司的方式         */        addUserInfosHead();        addRequestBodyInfos();        /**         * 生成json格式的字符串         */        requestion = ProtocolUtil.buildJSONPacketBody(headParameters,                bodyParameters);        Log.i("Evelyn", "requestion-->>"+requestion);        /**         * volley需要的body[]         */        requestStringBytes = null;        try {            requestStringBytes = requestion.getBytes("UTF-8");        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }    }    public byte[] Bitmap2Bytes(Bitmap bm) {        ByteArrayOutputStream baos = new ByteArrayOutputStream();        bm.compress(Bitmap.CompressFormat.PNG, 100, baos);        return baos.toByteArray();    }    @Override    public void onClick(View v) {        // upload image to server        if (v.getId() == R.id.uploadByvolley) {            StringRequest request = new StringRequest(Method.POST,                    url,                    new Listener<String>() {                        @Override                        public void onResponse(String arg0) {                            Log.e("TAG", "volley onResponse--->>" + arg0);                            /**                             * {"Response":{"head":{"statuscode":"000000",                             * "statusmsg":"sucess"}}}                             */                        }                    }, new Response.ErrorListener() {                        @Override                        public void onErrorResponse(VolleyError arg0) {                        }                    }) {                @Override                public byte[] getBody() throws AuthFailureError {                    return requestStringBytes;                }                @Override                public String getBodyContentType() {                    return String.format(                            "application/x-www-form-urlencoded; charset=%s",                            "utf-8");                }                @Override                public Map<String, String> getHeaders() throws AuthFailureError {                    Map<String, String> headers = new HashMap<String, String>();                    headers.put("Charset", "UTF-8");                    headers.put("Content-Type", "application/x-javascript");                    headers.put("Accept-Encoding", "gzip,deflate");                    return headers;                }            };            // 设置标签            queue.add(request);            queue.start();        }        if (v.getId() == R.id.upload) {            // 上传用户信息到后端服务器            userInfosToServer = new DataToServer(requestion, url);            new Thread() {                @Override                public void run() {                    userInfosToServer.uploadFile();                }            }.start();        }    }    /**     * 生成数据上传的头部,需要数据国鼎id,应用类型,操作系统类型     */    private void addUserInfosHead() {        headParameters.clear();        headParameters.add("godin_id", "0e6ad2a71e31752deb69d6e8c9eabe76");        headParameters.add("app_type", "3");        headParameters.add("os_type", "android");    }    /**     * 生成数据上传的数据包体     */    private void addRequestBodyInfos() {        bodyParameters.clear();        bodyParameters.add("photo_type", "jpeg");        bodyParameters.add("context",                Base64.encodeToString(bitmap2Bytes, Base64.DEFAULT));        bodyParameters.add("nickname", nick_name.getText().toString());    }}

DataToServer

package com.example.uploadphoto2server;import java.io.IOException;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.Socket;import java.net.URL;import java.net.UnknownHostException;import java.security.KeyManagementException;import java.security.KeyStore;import java.security.KeyStoreException;import java.security.NoSuchAlgorithmException;import java.security.UnrecoverableKeyException;import javax.net.ssl.HttpsURLConnection;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import org.apache.http.conn.ssl.SSLSocketFactory;import android.util.Log;/** * Created by Evelyn on 2016/7/5. */public class DataToServer {    //private String urlString = "https://www.imlianxi.com:7771/ExceptionLog";    private String urlString;    private String content = null;    public DataToServer(String requestJson, String path) {        this.content = requestJson;        this.urlString = path;    }    /* 上传文件至Server的方法 */    public void uploadFile() {        try {            initHttps();              URL url = new URL(urlString);            HttpURLConnection conn = (HttpURLConnection) url.openConnection();            conn.setConnectTimeout(5000);            conn.setDoOutput(true);//设置允许输出            conn.setRequestMethod("POST");            conn.setRequestProperty("User-Agent", "Fiddler");            conn.setRequestProperty("Content-Type", "application/json");            conn.setRequestProperty("Charset", "utf-8");            OutputStream os = conn.getOutputStream();            os.write(content.getBytes());            os.close();            /*服务器返回的响应码*/            int code = conn.getResponseCode();            if (code == 200) {                Log.d("Evelyn", "response code:" + code);            }            conn.disconnect();        } catch (Exception e) {            e.printStackTrace();        }    }    private void initHttps() {          try {              KeyStore trustStore = KeyStore.getInstance(KeyStore                      .getDefaultType());              trustStore.load(null, null);              SSLSocketFactoryEx sf = new SSLSocketFactoryEx(trustStore);              HttpsURLConnection.setDefaultSSLSocketFactory(sf.getSSLContext()                      .getSocketFactory());              HttpsURLConnection                      .setDefaultHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);          } catch (Exception e) {          }      }      static class SSLSocketFactoryEx extends SSLSocketFactory {          SSLContext sslContext = SSLContext.getInstance("TLS");          public SSLSocketFactoryEx(KeyStore truststore)                  throws NoSuchAlgorithmException, KeyManagementException,                  KeyStoreException, UnrecoverableKeyException {              super(truststore);              TrustManager tm = new X509TrustManager() {                  public java.security.cert.X509Certificate[] getAcceptedIssuers() {                      return null;                  }                  @Override                  public void checkClientTrusted(                          java.security.cert.X509Certificate[] chain,                          String authType)                          throws java.security.cert.CertificateException {                  }                  @Override                  public void checkServerTrusted(                          java.security.cert.X509Certificate[] chain,                          String authType)                          throws java.security.cert.CertificateException {                  }              };              sslContext.init(null, new TrustManager[] { tm }, null);          }          @Override          public Socket createSocket(Socket socket, String host, int port,                  boolean autoClose) throws IOException, UnknownHostException {              return sslContext.getSocketFactory().createSocket(socket, host,                      port, autoClose);          }          @Override          public Socket createSocket() throws IOException {              return sslContext.getSocketFactory().createSocket();          }          public SSLContext getSSLContext() {              return sslContext;          }      }  }

ProtocolUtil

package com.example.uploadphoto2server;  import android.annotation.SuppressLint;  import android.content.Context;  import android.net.ConnectivityManager;  import android.net.NetworkInfo;  /**  * simple tools to handle protocol for apps.  */  public class ProtocolUtil {      public static final String COLON = ": ";      public static final String LEFT_ANGLE_BRACKET = "{";      public static final String RIGHT_ANGLE_BRACKET = "}";      public static String buildJSONPacketBody(String[] headKey, Object[] headValue,              String[] bodyKey, Object[] bodyValue) {          if (((headKey == null || headKey.length == 0) && (headValue == null || headValue.length == 0)                   && (bodyKey == null || bodyKey.length == 0) && (bodyValue == null || bodyValue.length == 0))) {              throw new IllegalArgumentException();          }          StringBuffer sb = new StringBuffer(LEFT_ANGLE_BRACKET + "\r\n");          sb.append("\t\"Request\"" + COLON + LEFT_ANGLE_BRACKET + "\r\n");          if (headKey != null) {              sb.append("\t\t\"head\"" + COLON + LEFT_ANGLE_BRACKET + "\r\n");              for (int i = 0; i < headKey.length; i++) {                  sb.append("\t\t\t\"" + headKey[i].toLowerCase() + "\"" + COLON)                      .append(JSONUtil.object2json(headValue[i]));                  if(i != headKey.length -1) {                      sb.append(",");                  }                  sb.append("\r\n");              }              sb.append("\t\t" + RIGHT_ANGLE_BRACKET+ ",\r\n");          }          if (bodyKey != null) {              sb.append("\t\t\"body\"" + COLON + LEFT_ANGLE_BRACKET + "\r\n");              for (int i = 0; i < bodyKey.length; i++) {                  if (bodyKey[i] == null || bodyKey[i].equals("")) {                      continue;                  }                  sb.append("\t\t\t\"" + bodyKey[i].toLowerCase() + "\"" + COLON)                      .append(JSONUtil.object2json(bodyValue[i]));                  if(i != bodyKey.length -1) {                      sb.append(",");                  }                  sb.append("\r\n");              }              sb.append("\t\t" + RIGHT_ANGLE_BRACKET+ "\r\n");          }          sb.append("\t" + RIGHT_ANGLE_BRACKET + "\r\n");          sb.append(RIGHT_ANGLE_BRACKET);          clearObjectArray(headKey, headValue, bodyKey, bodyValue);          return sb.toString();      }      private static void clearObjectArray(String[] hk, Object[] hv, String[] bk, Object[] bv) {          if (hk != null && hv != null) {              for (int i = 0; i < hk.length; i++) {                  hk[i] = null;                  hv[i] = null;              }          }          hk = null;          hv = null;          if (bk != null && bv != null) {              for (int i = 0; i < bk.length; i++) {                  bk[i] = null;                  bv[i] = null;              }          }          bk = null;          bv = null;      }      public static String buildJSONPacketBody(JsonParameters headValues,              JsonParameters bodyValues) {          if ((headValues != null && !headValues.validate())                  || (bodyValues != null && !bodyValues.validate())) {              throw new IllegalArgumentException();          }          StringBuffer sb = new StringBuffer(LEFT_ANGLE_BRACKET + "\r\n");          sb.append("\t\"Request\"" + COLON + LEFT_ANGLE_BRACKET + "\r\n");          sb.append("\t\t\"head\"" + COLON + LEFT_ANGLE_BRACKET + "\r\n");          for (int i = 0; i < headValues.size(); i++) {              sb.append(                      "\t\t\t\"" + headValues.getKey(i).toLowerCase() + "\""                              + COLON).append(                      JSONUtil.object2json(headValues.getValue(headValues                              .getKey(i))));              if (i != headValues.size() - 1) {                  sb.append(",");              }              sb.append("\r\n");          }          sb.append("\t\t" + RIGHT_ANGLE_BRACKET + ",\r\n");          sb.append("\t\t\"body\"" + COLON + LEFT_ANGLE_BRACKET + "\r\n");          for (int i = 0; i < bodyValues.size(); i++) {              sb.append(                      "\t\t\t\"" + bodyValues.getKey(i).toLowerCase() + "\""                              + COLON).append(                      JSONUtil.object2json(bodyValues.getValue(bodyValues                              .getKey(i))));              if (i != bodyValues.size() - 1) {                  sb.append(",");              }              sb.append("\r\n");          }          sb.append("\t\t" + RIGHT_ANGLE_BRACKET + "\r\n");          sb.append("\t" + RIGHT_ANGLE_BRACKET + "\r\n");          sb.append(RIGHT_ANGLE_BRACKET);          headValues.clear();          bodyValues.clear();          return sb.toString();      }  }  

JSONUtil

package com.example.uploadphoto2server;  import java.lang.reflect.Field;  import java.math.BigDecimal;  import java.math.BigInteger;  import java.util.HashMap;  import java.util.List;  import java.util.Map;  import java.util.Set;  import com.google.gson.Gson;  public class JSONUtil {      /** 对象转换为json */      public static String object2json(Object obj) {          StringBuilder json = new StringBuilder();          if (obj == null) {              json.append("\"\"");          } else if (obj instanceof String || obj instanceof Integer || obj instanceof Float || obj instanceof Boolean                  || obj instanceof Short || obj instanceof Double || obj instanceof Long || obj instanceof BigDecimal                  || obj instanceof BigInteger || obj instanceof Byte) {              json.append("\"").append(string2json(obj.toString())).append("\"");          } else if (obj instanceof Object[]) {              json.append(array2json((Object[]) obj));          } else if (obj instanceof List) {              json.append(list2json((List<?>) obj));          } else if (obj instanceof Map) {              json.append(map2json((Map<?, ?>) obj));          } else if (obj instanceof Set) {              json.append(set2json((Set<?>) obj));          } else {              json.append(bean2json(obj));          }          return json.toString();      }      /** 对象转换为json */      public static String bean2json(Object bean) {          Gson gson = new Gson();          return gson.toJson(bean);      }      /** List转换为json */      public static String list2json(List<?> list) {          StringBuilder json = new StringBuilder();          json.append("[");          if (list != null && list.size() > 0) {              for (Object obj : list) {                  json.append(object2json(obj));                  json.append(",");              }              json.setCharAt(json.length() - 1, ']');          } else {              json.append("]");          }          return json.toString();      }      /** 数组转换为json */      public static String array2json(Object[] array) {          StringBuilder json = new StringBuilder();          json.append("[");          if (array != null && array.length > 0) {              for (Object obj : array) {                  json.append(object2json(obj));                  json.append(",");              }              json.setCharAt(json.length() - 1, ']');          } else {              json.append("]");          }          return json.toString();      }      /** map转换为json */      public static String map2json(Map<?, ?> map) {          StringBuilder json = new StringBuilder();          json.append("{");          if (map != null && map.size() > 0) {              for (Object key : map.keySet()) {                  json.append(object2json(key));                  json.append(":");                  json.append(object2json(map.get(key)));                  json.append(",");              }              json.setCharAt(json.length() - 1, '}');          } else {              json.append("}");          }          return json.toString();      }      /** set转换为json */      public static String set2json(Set<?> set) {          StringBuilder json = new StringBuilder();          json.append("[");          if (set != null && set.size() > 0) {              for (Object obj : set) {                  json.append(object2json(obj));                  json.append(",");              }              json.setCharAt(json.length() - 1, ']');          } else {              json.append("]");          }          return json.toString();      }      public static String string2json(String s) {          if (s == null)              return "";          StringBuilder sb = new StringBuilder();          for (int i = 0; i < s.length(); i++) {              char ch = s.charAt(i);              switch (ch) {              case '"':                  sb.append("\\\"");                  break;              case '\\':                  sb.append("\\\\");                  break;              case '\b':                  sb.append("\\b");                  break;              case '\f':                  sb.append("\\f");                  break;              case '\n':                  sb.append("\\n");                  break;              case '\r':                  sb.append("\\r");                  break;              case '\t':                  sb.append("\\t");                  break;              case '/':                  sb.append("\\/");                  break;              default:                  if (ch >= '\u0000' && ch <= '\u001F') {                      String ss = Integer.toHexString(ch);                      sb.append("\\u");                      for (int k = 0; k < 4 - ss.length(); k++) {                          sb.append('0');                      }                      sb.append(ss.toUpperCase());                  } else {                      sb.append(ch);                  }              }          }          return sb.toString();      }      /**      * 对象转map      *       * @param obj      * @return      */      public static Map<String, Object> objToMap(Object obj) {          Map<String, Object> map = new HashMap<String, Object>();          try {              /*              * BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());              * PropertyDescriptor[] propertyDescriptors = beanInfo              * .getPropertyDescriptors(); for (PropertyDescriptor property :              * propertyDescriptors) { String key = property.getName(); //              * 过滤class属性 if (!key.equals("class")) { // 得到property对应的getter方法              * Method getter = property.getReadMethod(); Object value =              * getter.invoke(obj); map.put(key, value); } }              */              Field[] fields = obj.getClass().getDeclaredFields();              for (Field field : fields) {                  String key = field.getName();                  boolean accessFlag = field.isAccessible();                  field.setAccessible(true);                  Object val = field.get(obj);                  if (val == null) {                      val = "";                  }                  map.put(key, val);                  field.setAccessible(accessFlag);              }          } catch (Exception e) {              e.printStackTrace();          }          return map;      }  }  

JsonParameters

package com.example.uploadphoto2server;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class JsonParameters {    private List<String> list = null;    private Map<String, Object> map = null;    public JsonParameters() {        list = new ArrayList<String>();        map = new HashMap<String, Object>();    }    public void add(String key, Object value) {        if(list.contains(key)){            list.remove(key);        }        list.add(key);        map.put(key, value);    }    public String getKey(int id) {        return list.get(id);    }    public Object getValue(String key) {        return map.get(key);    }    public int size(){        return list.size();    }    public boolean validate(){        return list.size() == map.size();    }    public void clear(){        list.clear();        map.clear();        //list = null;        //map = null;    }}
0 0
原创粉丝点击