从 Android 中的 Web 服务中恢复 base64 图像
Posted
技术标签:
【中文标题】从 Android 中的 Web 服务中恢复 base64 图像【英文标题】:Recover base64 image from a web service in Android 【发布时间】:2013-05-08 16:01:21 【问题描述】:我正在用 android 开发一个应用程序,它连接到 php 中的 Web 服务。用户可以发送图片,或者更确切地说,可以将图片发送给其他用户。
现在图像通过 xsd:base64binary 类型的 SOAP 发送到 Web 服务。用户拍照,带数据的字节数组转成base64后发送:
String img;
....
@Override
public void onPictureTaken(byte[] data, Camera camera)
img = Base64.encodeToString(data, Base64.NO_WRAP);
在服务器端,php 将 img 字符串存储在 mysql BLOB 列中。
当另一个用户请求图片时,服务器从 mysql 中检索一个 stdClass 中的数据,不仅是图像,还有 id、所有者等...并使用 php 函数 json_encode 将所有这些数据封装成一个 JSON 字符串. WSDL 文件中的返回类型是 xsd:string。回到 Android 我所做的是:
JSONArray array = new JSONArray(response);
JSONObject row;
String imgStr;
byte[] img;
for (int i = 0; i < array.length(); i++)
row = array.getJSONObject(i);
...
imgStr = row.getString("image");
...
if (!TextUtils.isEmpty(imgStr))
img = Base64.decode(imgStr, Base64.NO_WRAP);
//Insert byte[] in android SQLite
dao.insert(id, owner, img);
SQLite 中的表列类型也是 BLOB。当我从 SQLite 获取图像并尝试将其转换为 Bitmap 对象时,问题就出现了。代码:
...
byte[] img = cursor.getBlob(cursor.getColumnIndex(DB.M_IMG));
Bitmap bmp = BitmapFactory.decodeByteArray(img, 0, img.length);
...
img 字节数组似乎没问题,但 bmp 始终为空...
我所做的一些测试是在发送之前在图像所有者设备上获取 base64 字符串并将其传递给位图并获得良好的结果,这就是为什么我认为我的问题与 json 编码或添加字符有关php,我不知道...
更新:如果我对 mysql 数据库中的 base64 字符串进行硬编码,则不会创建位图,如果我对拍照时生成的 base64 字符串执行相同操作,则它可以工作。
我做错了什么?
【问题讨论】:
图片类型是什么?是 BMP 还是 JPEF 还是 PNG? 图片无格式,来自自定义Camera Activity,因客户要求,应用只将字节数组存储在SQLite中 看这里***.com/questions/6520745/… 基本上尝试在这里复制base64字符串,看看是否可行motobit.com/util/base64-decoder-encoder.asp 我几天前做了,那里没有答案... 【参考方案1】:在解决这个问题几天后,我得到了答案,这是一个 MySQL 问题。
显然 MySQL BLOB 类型最多只能存储 64Kb(发现错误的线索是所有图像都占用相同的 64Kb 空间...aswer 一直在那里,但我看不到它.. .)。因此,就我而言,解决方案一直在通过 LONGBLOB 更改 MySQL 中的 BLOB 类型...
感谢大家的宝贵时间。
【讨论】:
【参考方案2】:虽然我还在考虑这个问题,但有件事让我印象深刻:为什么要使用这么多,当您可以简单地使用 HttpClient、cookie 和检索图像而不是来回转换时。
此外,如果可能的话,除非您的图片尺寸很小,否则强烈建议不要存储 Blob。对我来说,一些设计更改将使整个代码(服务器和电话)更易于管理。
【讨论】:
如果我这样做是出于客户的要求,图片永远无法写入手机存储,这不是我可以处理的问题。所以最后我需要将它至少存储在 SQLite 中,但是是的,另一种方法可能是将字节发送到服务,将它们写入服务器中的文件,然后通过 HTTP 下载并将字节保存在 SQLite 中......但这就是我选择的方式以上是关于从 Android 中的 Web 服务中恢复 base64 图像的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 应用中使用 Smack 从 Openfire 服务器恢复两个用户之间的聊天记录