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的添加顺序来的。
- Android开发——相册拍照_04.图片上传
- Android开发——相册拍照_02.将拍照得到或相册中选择的图片显示在ImageView中
- Android开发:相册读取、拍照、图片裁剪和图片上传服务器等功能的实现
- Android开发之头像上传(包含拍照,从相册选择图片,裁剪等)
- HBuilder webApp开发(四)相册/拍照-图片上传
- Android开发——相册拍照_01.打开相册和拍照(同时)
- android 拍照或选择相册图片压缩上传
- Android 2种图片(相册--拍照)的上传方式
- Android实现图片(拍照+相册)上传功能
- [Android] WebView中拍照或从相册上传图片
- Android 拍照剪裁,获取相册图片,上传照片至服务端
- android 拍照,图库,相册,上传
- Android开发之 选择相册图片或者拍照
- 图片拍照上传和相册选取
- Hbuilder mui 相册拍照图片上传
- 利用 AFN 上传相册或拍照图片
- Android开发——相册拍照_03.解决相机拍照之后部分手机无法将图片保存到路径或部分手机点击相机确定无法返回问题
- 微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
- 同平台传输表空间实验
- sql 记录日周月点击
- 【CSS】样式继承
- SVN学习(三)-常用操作
- 扫描器的使用--Java基础019
- Android开发——相册拍照_04.图片上传
- Spring MVC 下Session监听器监听设置小细节
- eclipse的一些快捷键记录
- 泛型仿函数二
- Java虚拟机运行时数据区域
- javaee 数据库连接池C3P0
- sublime中node测试环境
- Android设计模式及面向对象原则
- codeforces 123E. Maze (概率与期望)