
本文旨在解决 Python 使用 zlib 压缩数据并通过 POST 请求发送到 PHP 服务器后,PHP 无法正确解压缩的问题。我们将深入探讨数据传输过程中常见的错误,并提供一种无需十六进制转换即可在 PHP 端成功解压缩 Python 压缩数据的解决方案。
在 Python 和 PHP 之间传输压缩数据时,一个常见的错误是将压缩后的二进制数据错误地转换为字符串。print(compressed) 在 Python 中会将字节序列以其字符串表示形式输出,而不是原始的字节数据。这种字符串表示形式在 PHP 端无法被正确识别和解压缩。
正确的做法是直接发送原始的二进制数据。
以下是修正后的 Python 代码:
立即学习“”;
import json import zlib import requests data = {"owner": "test"} compressed_data = zlib.compress(json.dumps(data).encode("utf-8")) # 直接发送压缩后的二进制数据 url = "your_php_server_url" # 替换为你的 PHP 服务器 URL headers = {'Content-Type': 'application/octet-stream'} # 设置 Content-Type 为 application/octet-stream response = requests.post(url, data=compressed_data, headers=headers) print(response.text) # 打印 PHP 服务器的响应
登录后复制
注意:
- Content-Type 头部设置为 application/octet-stream,这告诉服务器发送的是原始二进制数据。
- 使用 requests.post 方法的 data 参数直接发送 compressed_data。
接下来,是 PHP 端的代码,用于接收和解压缩数据:
<?php // 获取原始 POST 数据 $compressed_data = file_get_contents('php://input'); // 尝试解压缩数据 $decompressed_data = zlib_decode($compressed_data); if ($decompressed_data === false) { // 解压缩失败 echo "解压缩失败: " . zlib_get_coding_type(); // 获取错误类型 } else { // 解压缩成功 $data = json_decode($decompressed_data, true); if ($data === null) { // JSON 解码失败 echo "JSON 解码失败: " . json_last_error_msg(); } else { // 数据处理 print_r($data); } } ?>
登录后复制
注意:
- file_get_contents(‘php://input’) 用于获取 POST 请求的原始数据。
- zlib_decode() 函数用于解压缩数据。
- 需要进行错误处理,检查解压缩和 JSON 解码是否成功。zlib_get_coding_type() 和 json_last_error_msg() 可以提供更详细的错误信息。
总结:
关键在于直接发送和接收二进制数据,避免在 Python 端将压缩后的数据转换为字符串。通过设置正确的 Content-Type 头部,并在 PHP 端使用 file_get_contents(‘php://input’) 获取原始数据,可以成功地在 Python 和 PHP 之间传输和解压缩 zlib 压缩的数据。 此外,添加适当的错误处理机制能够帮助你快速定位和解决问题。
以上就是从 Python 到 PHP 的 Gzip 解压缩二进制数据教程的详细内容,更多请关注php中文网其它相关文章!
微信扫一扫打赏
支付宝扫一扫打赏
