php 控制字节流_php 如何接受并转换http字节流

我做一个php服务端, java客户端以http post方式,把文件流转换为字节流,再setEntity给我, java代码片段如下:

HttpPost post = new HttpPost(postUrl);

ByteArrayEntity entity = new ByteArrayEntity(outputStream.toByteArray());

post.setEntity(entity);

if (httpClient == null) {

httpClient = new DefaultHttpClient();

}

HttpResponse response = httpClient.execute(post);

我这边需要接受http字节流,并且全部转字符串,然后做解析。

1.请问我这边应该如何去获取流?用什么接口?php://input

2.获取后字节流如何转字符串? chr?unpack?还是如何?

我感觉不是普通应用层的http方式, 是比较原始的接受http数据的方式,请大牛帮忙指点方向.

(目前我用file(php://input)获取字节流,然后chr() 转ASCII字符再写入文件查看,貌似都是乱码)

注:字节流里面只有ascii字符,没有中文字符.

回复讨论(解决方案)

补充下:

原始文件流里面的内容如下:

launch {"primary":"-1415673003223"} 1415673003223

controller {"model":"Test Controller","primary":"count"} 1415673003991

click {"click_name":"Test Button Name","primary":"count"} 1415673004598

view {"view_name":"Test Page Name","primary":"1415673005202"} 1415673005203

view {"view_name":"Test Page Name","primary":"-1415673005795"} 1415673005795

game {"package_name":"Test Game","primary":"1415673007231"} 1415673007231

game {"package_name":"Test Game","primary":"-1415673008047"} 1415673008051

如果只是存入文件 你可以$path ="/tmp/newfile"$content = isset($GLOBALS["HTTP_RAW_POST_DATA"]) ? $GLOBALS["HTTP_RAW_POST_DATA"] : '';file_put_contents($path, $fileContent);

如果要进行处理 你需要

$content = isset($GLOBALS["HTTP_RAW_POST_DATA"]) ? $GLOBALS["HTTP_RAW_POST_DATA"] : '';//然后对$content进行字符串处理得到你需要的结构

如果只是存入文件 你可以$path ="/tmp/newfile"$content = isset($GLOBALS["HTTP_RAW_POST_DATA"]) ? $GLOBALS["HTTP_RAW_POST_DATA"] : '';file_put_contents($path, $fileContent);

如果要进行处理 你需要

$content = isset($GLOBALS["HTTP_RAW_POST_DATA"]) ? $GLOBALS["HTTP_RAW_POST_DATA"] : '';//然后对$content进行字符串处理得到你需要的结构

我试了下您的方式, 取出来的content是乱码,这也是一直我卡住的地方。如您所见,java端在最初写入文件,到读取文件流,到转换字节流,到setEntity都没有做字符编码的特殊处理。所以接下来如何处理乱码的问题呢?

$s = file_get_contents('php://input');

file_put_contents('test.txt', base54_encode($s));

贴出 test.txt 的内容

$s = file_get_contents('php://input');

file_put_contents('test.txt', base54_encode($s));

贴出 test.txt 的内容

H4sIAAAAAAAAAH3OXWuDMBgF4Ov2Z3gdJIn5UsiFjIwVnB3ald1JTFIaMLFYLIyx/z63wkZhFN6bw8vDOTraafS2u0SJGAijdYOs3G7/xiCY3OD02X3/dqrddY2qVNmqbq+adrOtu8dt07Xl80ulwMVFO04ynIPIF+mD8zLOwwBm/8tfN/9KIyEI2khkiswVghR0OV4cLJittxL3mFnIiYa9JY7mPTaYCJ4zwdwhs73jiNIeI2COOsZl/U/Xw1NZ16q6KYrXRf4kEUypSGmWYsLWg56jOa4+ktPkg57ekyJBBFEmMs44Ezz5XN3kOyCHDGbkD1zz+gslJTZeZAEAAA==

你说的是base64_encode吧,请指教!

$s = file_get_contents('php://input');

file_put_contents('test.txt', base54_encode($s));

贴出 test.txt 的内容

刚刚用mb_detect_encoding($s, "auto") 检测了下 返回的是UTF-8, 但是存到文件里用vim看是乱码。难道是vim的问题?

$s = file_get_contents('php://input');

file_put_contents('test.txt', base54_encode($s));

贴出 test.txt 的内容

我把文件拷贝到本地用配置好UTF-8的vim 查看,还是乱码...

接收到的的确是“乱码”,因为他做了 gzip 压缩$s = 'H4sIAAAAAAAAAH3OXWuDMBgF4Ov2Z3gdJIn5UsiFjIwVnB3ald1JTFIaMLFYLIyx/z63wkZhFN6bw8vDOTraafS2u0SJGAijdYOs3G7/xiCY3OD02X3/dqrddY2qVNmqbq+adrOtu8dt07Xl80ulwMVFO04ynIPIF+mD8zLOwwBm/8tfN/9KIyEI2khkiswVghR0OV4cLJittxL3mFnIiYa9JY7mPTaYCJ4zwdwhs73jiNIeI2COOsZl/U/Xw1NZ16q6KYrXRf4kEUypSGmWYsLWg56jOa4+ktPkg57ekyJBBFEmMs44Ezz5XN3kOyCHDGbkD1zz+gslJTZeZAEAAA==';$s = base64_decode($s);echo gzdecode($s); android_vn=16,model=LeTVX60,release_vn=TEST_RELEASE_VERSION_FOR_SAMPLE,vendor=msm8960,imei=null,ui_vn=TEST_UI_VERSION_FOR_SAMPLE,vc=0,mac=1c:3e:84:54:57:fd,udid=2b26d074a0bd4e59b2c24879686ef3dbe7155b21,channel=TEST_CHANNEL_FOR_SAMPLE,vn=null,ip=10.58.53.246launch{"primary":"1415683767687"}1415683767687launch{"primary":"1415683906034"}1415683906034应该是这个(解压没有出错,得到的文字完整)

$s = 'H4sIAAAAAAAAAH3OXWuDMBgF4Ov2Z3gdJIn5UsiFjIwVnB3ald1JTFIaMLFYLIyx/z63wkZhFN6bw8vDOTraafS2u0SJGAijdYOs3G7/xiCY3OD02X3/dqrddY2qVNmqbq+adrOtu8dt07Xl80ulwMVFO04ynIPIF+mD8zLOwwBm/8tfN/9KIyEI2khkiswVghR0OV4cLJittxL3mFnIiYa9JY7mPTaYCJ4zwdwhs73jiNIeI2COOsZl/U/Xw1NZ16q6KYrXRf4kEUypSGmWYsLWg56jOa4+ktPkg57ekyJBBFEmMs44Ezz5XN3kOyCHDGbkD1zz+gslJTZeZAEAAA==';$s = base64_decode($s);echo gzdecode($s); android_vn=16,model=LeTVX60,release_vn=TEST_RELEASE_VERSION_FOR_SAMPLE,vendor=msm8960,imei=null,ui_vn=TEST_UI_VERSION_FOR_SAMPLE,vc=0,mac=1c:3e:84:54:57:fd,udid=2b26d074a0bd4e59b2c24879686ef3dbe7155b21,channel=TEST_CHANNEL_FOR_SAMPLE,vn=null,ip=10.58.53.246launch{"primary":"1415683767687"}1415683767687launch{"primary":"1415683906034"}1415683906034

接收到的的确是“乱码”,因为他做了 gzip 压缩$s = 'H4sIAAAAAAAAAH3OXWuDMBgF4Ov2Z3gdJIn5UsiFjIwVnB3ald1JTFIaMLFYLIyx/z63wkZhFN6bw8vDOTraafS2u0SJGAijdYOs3G7/xiCY3OD02X3/dqrddY2qVNmqbq+adrOtu8dt07Xl80ulwMVFO04ynIPIF+mD8zLOwwBm/8tfN/9KIyEI2khkiswVghR0OV4cLJittxL3mFnIiYa9JY7mPTaYCJ4zwdwhs73jiNIeI2COOsZl/U/Xw1NZ16q6KYrXRf4kEUypSGmWYsLWg56jOa4+ktPkg57ekyJBBFEmMs44Ezz5XN3kOyCHDGbkD1zz+gslJTZeZAEAAA==';$s = base64_decode($s);echo gzdecode($s); android_vn=16,model=LeTVX60,release_vn=TEST_RELEASE_VERSION_FOR_SAMPLE,vendor=msm8960,imei=null,ui_vn=TEST_UI_VERSION_FOR_SAMPLE,vc=0,mac=1c:3e:84:54:57:fd,udid=2b26d074a0bd4e59b2c24879686ef3dbe7155b21,channel=TEST_CHANNEL_FOR_SAMPLE,vn=null,ip=10.58.53.246launch{"primary":"1415683767687"}1415683767687launch{"primary":"1415683906034"}1415683906034应该是这个(解压没有出错,得到的文字完整)

这个回答完全正确!确实是做了gzip压缩,交学费了!而且我之前也是知道他把文件流做了gzip压缩, 但是对这个不清楚所以也没有在提问中说道,自己也没有望着方面想。

另外请教一下, 你是如何得知做了gzip压缩的?小弟刚开始做php,希望不吝赐教!

接收到的的确是“乱码”,因为他做了 gzip 压缩$s = 'H4sIAAAAAAAAAH3OXWuDMBgF4Ov2Z3gdJIn5UsiFjIwVnB3ald1JTFIaMLFYLIyx/z63wkZhFN6bw8vDOTraafS2u0SJGAijdYOs3G7/xiCY3OD02X3/dqrddY2qVNmqbq+adrOtu8dt07Xl80ulwMVFO04ynIPIF+mD8zLOwwBm/8tfN/9KIyEI2khkiswVghR0OV4cLJittxL3mFnIiYa9JY7mPTaYCJ4zwdwhs73jiNIeI2COOsZl/U/Xw1NZ16q6KYrXRf4kEUypSGmWYsLWg56jOa4+ktPkg57ekyJBBFEmMs44Ezz5XN3kOyCHDGbkD1zz+gslJTZeZAEAAA==';$s = base64_decode($s);echo gzdecode($s); android_vn=16,model=LeTVX60,release_vn=TEST_RELEASE_VERSION_FOR_SAMPLE,vendor=msm8960,imei=null,ui_vn=TEST_UI_VERSION_FOR_SAMPLE,vc=0,mac=1c:3e:84:54:57:fd,udid=2b26d074a0bd4e59b2c24879686ef3dbe7155b21,channel=TEST_CHANNEL_FOR_SAMPLE,vn=null,ip=10.58.53.246launch{"primary":"1415683767687"}1415683767687launch{"primary":"1415683906034"}1415683906034应该是这个(解压没有出错,得到的文字完整)

感谢回答,另外也感谢orangeholic 这位朋友的帮助!

base64 解码后的是二进制串,而你在#1补充了原始文件的样式(显然不是二进制的)

所以尝试了可能的压缩算法,不想一下就对上了

补充一下,得到的串的同两个字符是 "\x1f\x8b"

这是 gzip 的文件头标识

补充一下,得到的串的同两个字符是 "\x1f\x8b"

这是 gzip 的文件头标识

学习了!多谢! 100分已经给你了!赞!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP中,我们可以使用GD库来实现将二进制字节流转换为二维码图片并将其显示在页面上。 首先,我们需要确保服务器上已经安装了GD库。可以通过检查phpinfo()函数的输出来验证。 接下来,我们需要使用一个PHP二维码生成库,例如ZXing或phpQRCode。这些库提供了一些函数和方法来生成和处理二维码。 首先,我们需要从二进制字节流中创建一个图像资源。可以使用imagecreatefromstring()函数将字节流转换为图像资源。 然后,我们可以使用库中提供的函数或方法将图像资源转换为二维码。这通常涉及设置二维码的内容、大小和错误纠正级别等信息。具体的方法和函数可能会因所使用的库而有所不同。 一旦我们生成了二维码图像,我们可以使用imagepng()或imagejpeg()函数将其保存为PNG或JPEG格式的图像文件。 最后,我们可以将生成的二维码图像直接输出到浏览器,以便在页面上显示。可以使用header()函数设置适当的Content-Type头,然后使用imagepng()或imagejpeg()函数将图像输出到浏览器。 以下是一个简单的例子,演示如何使用phpQRCode库将二进制字节流转换为二维码并在页面上显示: ```php <?php // 引入phpQRCode库 require_once 'phpqrcode/qrlib.php'; // 二进制字节流 $byteStream = ... // 从其他地方获取二进制字节流 // 创建图像资源 $image = imagecreatefromstring($byteStream); // 设置二维码内容和大小 $text = 'http://example.com'; $size = 5; // 创建二维码 QRcode::png($text, false, QR_ECLEVEL_L, $size, 2); // 输出到浏览器 header('Content-Type: image/png'); imagepng($image); imagedestroy($image); ?> ``` 在上面的例子中,我们通过引入phpQRCode库将二进制字节流转换为图像资源,然后使用QRcode类的png()方法创建二维码。最后,我们将生成的二维码图像输出到浏览器。请注意,你需要将phpqrcode文件夹中的库文件正确放置在项目中。 这只是一个简单的示例,实际使用时还需要根据具体需求进行适当的调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值