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; }}
- Volley学习(五)HttpUrlConnection、Volley 2种方式实现头像上传
- volley学习笔记(五):Android Volley框架的几种post提交请求方式
- Bmob平台实现头像上传+Volley框架加载图片url
- Volley实现图片上传
- Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp、Volley
- Volley-XUtils-OkHttp三种方式实现单张多张图片上传
- HttpURLConnection,HttpClient,Volley
- Volley 学习 2
- Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比
- Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比
- Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比
- Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比
- Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比
- Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比
- Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点
- volley 学习
- volley学习
- volley 学习
- HDU1158(dp46)
- Imageloader四种图片显示(圆形,淡入,圆角,修饰)使用
- 滤镜(内部效果)&快速蒙版(边缘效果)——羊皮卷
- android检查权限问题。
- gcc -L参数和-l参数
- Volley学习(五)HttpUrlConnection、Volley 2种方式实现头像上传
- POJ 1251 Jungle Roads
- svm松弛变量与惩罚因子
- Linux电源管理(9)_wakelocks
- React Native商城项目实战01 - 初始化设置
- 利用sudo控制用户对系统命令的使用权限
- 树莓派Odroid等卡片式电脑上搭建NAS教程系列1-Ubuntu系统安装
- BZOJ 2039 最小割
- Three.js 添加世界坐标轴三个轴指向