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();

}

通用自动更新NSIS安装包程序 检查本地的配置版本与服务器配置的版本, 如果服务器比较新则进行下载并更新文件. 注意: 需要结合NSIS安装包进行安装. 升级时采用/S静默安装方式进行安装. 配置中, "name"属性指定的应用程序, 将最后被安装. 程序目前只支持更新一个主程序和一个插件程序, 其他功能自行完善 带源码, 带完整配置文件, 各项主要设置均可通过配置文件修改, 并包含程序逻辑简要描述说明文件. 功能不复杂, 主要是不想重复开发. 7. 程序逻辑: a. CommonAutoUpdate启动后, 将检查和加载本地配置文件, 加载成功后, 将判断"run"中指定的程序是否正在运行. 如果在运行, 则给出错误提示后, 退出更新程序; b. 如果"run"中的程序没有在运行, 则根据svrurl + "/commonAutoUpdate.xml" 地址, 加载服务器上的配置文件; c. 在加载配置文件过程中, 任何的异常, 均会提示"检查自动更新失败, 请稍后再试", 并退出; (不会启动"run"中配置的文件) d. 如果加载成功, 则会对比本地"version"中的版本号与服务器"cv"节点中的"v"属性的版本号; e. 如果服务器版本号小于或等于本地版本号, 则不进行更新, 直接运行"run"中指定的程序, 并传递"cau"参数作为标记; f. 如果服务器版本号大于本地版本号, 则会显示提示更新的界面, 在点击确定按钮后, 开始下载服务器"cv"节点中的"p"属性指定的文件; g. 待下载完成, 则会退出, 并运行下载的安装包进行安装.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值