今天写代码测试服务器程序时,客户端用 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
详细参考:《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(); }