Maison >développement back-end >tutoriel 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进行字符串处理得到你需要的结构
你
$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 的内容
你
$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 的内容
接收到的的确是“乱码”,因为他做了 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 压缩
$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应该是这个(解压没有出错,得到的文字完整)
base64 解码后的是二进制串,而你在#1补充了原始文件的样式(显然不是二进制的)
所以尝试了可能的压缩算法,不想一下就对上了
补充一下,得到的串的同两个字符是 "\x1f\x8b"
这是 gzip 的文件头标识
补充一下,得到的串的同两个字符是 "\x1f\x8b"
这是 gzip 的文件头标识