今天说一下我的图片上传方法,整体思路是自己拼写出一个html页面,然后使用post的方法将图片传到后台。


上传的执行不会在主线程中,所以我们新起一个线程,并用Handler将信息回传到主线程


    private void uploadImage() {        new Thread(uploadImageRunnable).start();        //这里可以显示进度条    }    Runnable uploadImageRunnable = new Runnable() {        @Override        public void run() {            Message resultMessage = new Message();            resultMessage.what = 0;            //上传图片后回传的结果会储存在 resultMessage.obj 中            try {                //TODO 上传图片以及附加信息            } catch (Exception e) {                e.printStackTrace();            }            handler.sendMessage(resultMessage);        }    };    Handler handler = new Handler(new Handler.Callback() {        @Override        public boolean handleMessage(Message msg) {            switch (msg.what) {                case 0:                    //这里可以让进度条消失                    try {                        //TODO 处理回传结果                    } catch (Exception e) {                        e.printStackTrace();                    }                default:                    break;            }            return false;        }    });


接下来我来说说“上传图片及附加信息”部分该如何完成


首先新建URL对象(注意这里是https,所以后面会设置SSL的相关信息)

URL url = new URL("https://......");

然后建立连接的对象

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
设置连接对象的各种属性

                conn.setConnectTimeout(5000);                conn.setDoOutput(true);                conn.setRequestMethod("POST");                conn.setUseCaches(false);                conn.setRequestProperty("Charset", "UTF-8");                conn.setRequestProperty("ser-Agent", "Fiddler");                conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + MyUpLoadUtils.BOUNDARY);

MyUpLoadUtils.BOUNDARY是个分割线,这个大家可以自行寻找下html的拼写方法,这里我就不多说了,它的值如下(随意设置的)

public static final String BOUNDARY = "--my_boundary--";


然后要说SSL协议的设置了,这里有两个东西要设置,一是HostnmaeVerifier,连接地址的验证,二是SSLSocketFactory,这个是二次握手什么的,深入的我也没研究,也是学别人的编写方式编写的,我是在StackOverFlow上学的......


                HostnameVerifier hnv = new HostNameVerifier();                conn.setHostnameVerifier(hnv);                SSLContext sslcontext = SSLContext.getInstance("TLS");                sslcontext.init(null, new TrustManager[]{new X509TrustManagerImpl()}, null);                conn.setSSLSocketFactory(sslcontext.getSocketFactory());

HostNameVerifier 继承 AbstractVerifier,重写verify方法。

X509TrustManagerImpl 实现 javax.net.ssl.X509TrustManager接口,大家可以自己查查。


好了,设置完连接的各种属性,我们开始传输东西,首先获取输出流对象

                OutputStream os = conn.getOutputStream();                DataOutputStream ds = new DataOutputStream(os);
然后开始输出,这里我用自己的方法包装了一下

                MyUpLoadUtils.writeStringParams(textParams, ds);                MyUpLoadUtils.writeBytes(imageBytes, textParams.get("fileName"), ds);                MyUpLoadUtils.paramsEnd(ds);
textParams是个Map,里面有附加的一些文字信息,imageBytes是图片的二进制数组,具体方法实现如下

    /**     * 普通字符串数据     */    public static void writeStringParams(Map textParams, DataOutputStream ds) throws Exception {        Set keySet = textParams.keySet();        for (Iterator it = keySet.iterator(); it.hasNext(); ) {            String name = it.next();            String value = textParams.get(name);            ds.writeBytes("--" + BOUNDARY + "\r\n");            ds.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"\r\n");            ds.writeBytes("\r\n");            value = value + "\r\n";            ds.write(value.getBytes());        }    }    /**     * 文件数据     */    public static void writeBytes(byte[] imageBytes, String fileName, DataOutputStream ds) throws Exception {        ds.writeBytes("--" + BOUNDARY + "\r\n");        ds.writeBytes("Content-Disposition: form-data; name=\"" + "uploadFile" +                "\"; filename=\"" + fileName + "\"\r\n");        ds.writeBytes("Content-Type:application/octet-stream; charset=utf-8 \r\n");        ds.writeBytes("\r\n");        ds.write(imageBytes);        ds.writeBytes("\r\n");    }    /**     * 添加结尾数据     */    public static void paramsEnd(DataOutputStream ds) throws Exception {        ds.writeBytes("--" + BOUNDARY + "--" + "\r\n");        ds.writeBytes("\r\n");    }

别忘记关闭输出流对象

os.close();
然后我们获取服务器的响应信息

                int code = conn.getResponseCode();                if (code == 200) {// 返回的响应码200,是成功                    // 得到网络返回的输入流                    InputStream is = conn.getInputStream();                    resultMessage.obj = MyUpLoadUtils.readString(is);                } else {                    ToastUtils.show("请求URL失败!");                }

readString方法如下:

    public static String readString(InputStream is) {        byte[] result = readBytes(is);        if(result != null){            return new String(result);        }else{            return "";        }    }    private static byte[] readBytes(InputStream is) {        try {            byte[] buffer = new byte[1024];            int len = -1;            ByteArrayOutputStream baos = new ByteArrayOutputStream();            while ((len = is.read(buffer)) != -1) {                baos.write(buffer, 0, len);            }            baos.close();            return baos.toByteArray();        } catch (Exception e) {            e.printStackTrace();        }        return null;    }


以上是“上传图片及附加信息”部分,放在try{}catch中,最后我们把回传的信息通过Handler传入主线程中

handler.sendMessage(resultMessage);

最后,在主线程中用Gosn解析,处理回传结果

                        String result = (String) msg.obj;                        Log.e(TAG, result);                        JSONObject jsonObject = new JSONObject(result);                        Gson gson = new Gson();                        XXXXX item = gson.fromJson(result, XXXXX.class);//TODO 处理回传信息

以上就是我的上传图片方法。









更多相关文章

  1. Android官方使低版本系统(2.1)支持ActionBar的方法
  2. Androi与html中的JavaScript之间方法相互调用
  3. 【Android】Android中Button的OnClickListener实现方法
  4. Android webview中定制js的alert,confirm和prompt对话框的方法 (
  5. Android 性能优化的一些方法(转)
  6. 消除“Unfortunately, System UI has stopped”的方法

随机推荐

  1. android点滴积累
  2. Android动画中Interpolator 加速器的使用
  3. 在android目录下一键生成cscope.out文件
  4. android:maxLines和android:ellipsize同
  5. RelativeLayout相对布局和LinearLayout线
  6. 在android中button响应的两种方式
  7. android使用http协议上传文件
  8. Android(安卓)log日志记录方法
  9. Android(安卓)Matrix
  10. Android如何下抓取tcp数据包