java base64转图片打不开_解决通过 Base64 解码得到的图片无法打开查看的问题

今天写代码测试服务器程序时,客户端用 Python 将图片利用 Base64 编码传输到服务器,服务器语言是 PHP,再将 Base64 编码解码成图片。在实际测试中,服务器后面的代码总是无法进行,说无法识别图片(不支持此文件格式),最后发现其实是自己在测试中忽略了一个小问题,这里与大家分享下,如果你也有类似的问题,看看是不是犯了跟老王一样的错误。

一、问题描述与解决

客户端用的是 Python base64 包中的 b64encode 函数,服务器端用的是 PHP 中的 base64_decode 函数。

测试时,服务器端的 Python 算法中总是提示图片无法 identified,一开始我还以为是流传输中出了问题,图片流没有成功传到服务器,后来发现图片已经保存在中间文件夹中了,只不过无法正常查看打开,提示“似乎不支持此文件格式”:

因为用的 Base64 编码和解码都是 Python / PHP 自带的函数,所有加密和解密过程应该不会出错,后来再检查发现在写客户端测试脚本时加了前缀字符串 data:image/jpg;base64,,这个是适合任何在线 Base64 与图片互转工具生成的 Base64 编码都会有这个前缀,有这个前缀也就能直接作为 img 标签的 src 了,当时写 Python 测试代码的时候不知道哪里抽了一下,居然还手动加了这个前缀:

def read_image(self, filepath):

with open(filepath, "rb") as f:

base64_data = base64.b64encode(f.read())

self.body['image'] = "data:image/jpg;base64," + str(base64_data, 'utf-8')

删除这个前缀再传到服务器,发现解码后图片就能正常查看打开了。

以上就是老王这次遇到的通过 Base64 解码得到的图片无法打开查看问题的原因以及解决方法,其实很简单,但是一开始以为是流传输那里出问题了还调试了好久,如果你也遇到了类似的问题,不妨看看是不是自己的 Base64 字符串出了问题。

二、一些图片与 Base64 互转的代码

1、PHP

2、Python

with open(filepath, "rb") as f:

base64_data = base64.b64encode(f.read())

self.body['image'] = "data:image/jpg;base64," + str(base64_data, 'utf-8')

3、Java

BASE64Decoder decoder = new BASE64Decoder();

try {

FileOutputStream write = new FileOutputStream(new File(path

+ imgName));

byte[] decoderBytes = decoder.decodeBuffer(base64);

write.write(decoderBytes);

write.close();

} catch (IOException e) {

e.printStackTrace();

}


版权声明:本文为weixin_30072631原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。