解决通过 Base64 解码得到的图片无法打开查看的问题

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

一、问题描述与解决

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

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

通过 Base64 解码得到的图片无法打开查看

因为用的 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

详细参考:《PHP 实现图片 Base64 编码与解码

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();  
        }
赞(2)
关注我们
未经允许不得转载:老王博客 » 解决通过 Base64 解码得到的图片无法打开查看的问题

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址