Java - 另一个 "BitmapFactory.decodeByteArray always null"
Java - Another "BitmapFactory.decodeByteArray always null"
我有一张图片以这种形式存储在数据库中
"/9j/4AAQSkZJRgABAQAAAQABAAD/2w <...> igD//2Q=="
所以绝对是 base64 编码。
我通过 php 函数得到它:
...
$query = $db->prepare("SELECT `Data` FROM `UserPicture` WHERE `UserId` = ?");
$query->bind_param('i', $id);
$query->execute();
$query->bind_result($data);
$query->fetch();
echo base64_encode($data);
Android 通过调用获取:
StringBuffer result = m_dbi.getResult(Constants.SERVER_HOST_PHP + "/get_user_picture.php", params, "GET");
调试我发现结果是正确的。
我将 result.toString() 传递给 writeImageToFile(String pic) ,它执行以下操作:
...
byte[] decodedByte = Base64.decode(pic, Base64.DEFAULT);
Bitmap bm = BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length);
...
pic 和 decodedByte.length 一样正确,但是 bm 始终为空.
我已经尝试将 Base64.DEFAULT 更改为 NO_PADDING 或 NO_WRAP 但始终为空。
可能是什么原因?
问题是因为您使用 mysqli
的 real_escape_string()
将图像保存在 BLOB 中。与任何字符串转义方法一样,此方法适用于文本,并更改它认为是无效字符的内容。将此应用于图像而不是字符串会损坏图像。
BLOB 应使用 this Oracle blog entry 中描述的过程存储,使用 send_long_data()
并且不转义。
我有一张图片以这种形式存储在数据库中
"/9j/4AAQSkZJRgABAQAAAQABAAD/2w <...> igD//2Q=="
所以绝对是 base64 编码。
我通过 php 函数得到它:
...
$query = $db->prepare("SELECT `Data` FROM `UserPicture` WHERE `UserId` = ?");
$query->bind_param('i', $id);
$query->execute();
$query->bind_result($data);
$query->fetch();
echo base64_encode($data);
Android 通过调用获取:
StringBuffer result = m_dbi.getResult(Constants.SERVER_HOST_PHP + "/get_user_picture.php", params, "GET");
调试我发现结果是正确的。
我将 result.toString() 传递给 writeImageToFile(String pic) ,它执行以下操作:
...
byte[] decodedByte = Base64.decode(pic, Base64.DEFAULT);
Bitmap bm = BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length);
...
pic 和 decodedByte.length 一样正确,但是 bm 始终为空.
我已经尝试将 Base64.DEFAULT 更改为 NO_PADDING 或 NO_WRAP 但始终为空。
可能是什么原因?
问题是因为您使用 mysqli
的 real_escape_string()
将图像保存在 BLOB 中。与任何字符串转义方法一样,此方法适用于文本,并更改它认为是无效字符的内容。将此应用于图像而不是字符串会损坏图像。
BLOB 应使用 this Oracle blog entry 中描述的过程存储,使用 send_long_data()
并且不转义。