您好,欢迎访问一九零五行业门户网

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分已经给你了!赞!
其它类似信息

推荐信息