Android开发——相册拍照_04.图片上传

来源:互联网 发布:剑三藏剑正太脸数据 编辑:程序博客网 时间:2024/04/30 15:09

图片选择已经搞定了,那么剩下的就是图片上传了!

经过与服务端的商量之后,我们决定用Base64编码将图片转换为String值,再传递到服务端,服务端再进行解码得到图片。

图片转码方法:

/**     * 将图片路径里的图片通过Base64编码转换为字符串     * @param path     * @return 编码之后得到的字符串     */    private String postImage(String path)    {        InputStream in = null;        byte[] data = null;        // 读取图片字节数组        try        {            in = new FileInputStream(path);            data = new byte[in.available()];            in.read(data);            in.close();        } catch (IOException e)        {            e.printStackTrace();        }        // 对字节数组Base64编码        BASE64Encoder encoder = new BASE64Encoder();        return encoder.encode(data);// 返回Base64编码过的字节数组字符串    }

这里需要依赖一个jar包:sun.misc.BASE64Decoder.jar,网络上可下载。

下面开始图片上传代码:
在此之前,说明一下情况,省得一些朋友直接复制不清楚,我的需求是将两个图片都进行上传,所以用了String类型的ArrayList容器,并且代码中会有2个路径和转码得到的String值,免的一些朋友没有注意到。

@Override            public void onClick(View v)            {                    //信息正确,开始图片上传                    list = new ArrayList<String>();                    String  imageUp = postImage(pathUp);                    if (imageUp != null)                    {                        list.add(imageUp);                    }                    String  imageDown = postImage(pathDown);                    if (imageDown != null)                    {                        list.add(imageDown);                    }                    thread = new Thread(runnable);                    thread.start();                }            }

线程加载的Runnable类:

private Runnable runnable = new Runnable()    {        @Override        public void run()        {                Looper.prepare();// 创建消息循环                for (int j = 0; j < list.size(); j++)                {                    String pic = HttpServiceClientUtils.getPic(list.get(j));                    if(j == list.size() - 1)                    {                        list.clear();                    }                    Message msg = new Message();                    msg.obj = pic;                    imageHandler.sendMessage(msg);                }                Looper.loop();// 从消息队列取消        }    };

HttpServiceClientUtils.getPic这个方法是我自己写的上传到服务端的webservice方法,这个方法具体的内容是服务端给的,我只需要传递1个参数:public static String getPic(String image)

参数image就是自己转码之后得到的String值,将这个传递给服务端,之后服务端会将得到的结果进行解码转换成图片。

以为我这个方法上传之后,服务端会给我返回结果,结果就是图片的名字,所以我使用了Handle类来对返回的结果进行处理。

private Handler imageHandler = new Handler()    {        @Override        public void handleMessage(Message msg)        {            super.handleMessage(msg);            Log.e("msg", "" + msg.obj);            if(list.size() == 0)            {                Log.e("上传完毕", "上传完毕");                // 因为在上述代码中有进行list.clear方法,所以当list的size为0的时候,即为上传完毕,开始进行后续代码                // TODO            }        }    };

以上就是Android端的图片上传,上传之后,服务端会根据传递的参数image(Base64编码转换的String值),来进行解码,并保存到服务器,最后给你返回参数,这部分代码我就不复制过来了,毕竟是服务端的东西=。=

注意点:上面的Runnable类里的run方法是创建了一个单线程消息队列,所以可以多次点击,而里面的for循环的逻辑是当第一张图片上传之后得到返回值,再循环开始上传第二张,所以在handler中得到的返回值是按照list的添加顺序来的。

0 0
原创粉丝点击