php 文件以流的方式传输

sighshadow 2013-06-26 01:07:04
场景:
客户端获取服务器上的mp3文件播放,但是因为某些原因客户端无法写文件,也就是不能下载操作。
现在想法是在php端用 fopen -> fread ->echo 把mp3的buffer读到内存,客户端收到buffer存入内存中,然后播放内存中的声音。

问题:
现在是服务器上有一个5143字节的Mp3,但是客户端只收到5042.测试是有某些字符被转义了,在网上找过很多方法,似乎都不行,php才学,有什么方法可以让他不转义 得到正确的文件buffer呢。
...全文
552 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2013-06-27
  • 打赏
  • 举报
回复
0x0d 的丢失肯定不是 php 端的问题,否则由 php 发出的图片和各种二进制数据不都被破坏了吗?怎么只有你遇到了 我感觉是你的 c 程序的问题,如果你是用 fgets 读取数据的话
ImN1 2013-06-27
  • 打赏
  • 举报
回复
我有个疑问,你的php不会是发了header吧?什么header?
sighshadow 2013-06-27
  • 打赏
  • 举报
回复
引用 15 楼 xuzuning 的回复:
0x0d 的丢失肯定不是 php 端的问题,否则由 php 发出的图片和各种二进制数据不都被破坏了吗?怎么只有你遇到了 我感觉是你的 c 程序的问题,如果你是用 fgets 读取数据的话
最开始就想到编码 但是没做,刚尝试了下 果然可以了 用了base64编码。 感谢版主一直以来的回复,感谢各位的顶贴。
sighshadow 2013-06-27
  • 打赏
  • 举报
回复
引用 15 楼 xuzuning 的回复:
0x0d 的丢失肯定不是 php 端的问题,否则由 php 发出的图片和各种二进制数据不都被破坏了吗?怎么只有你遇到了 我感觉是你的 c 程序的问题,如果你是用 fgets 读取数据的话
恩,我也觉得 是不是要在php的文件里加啥东西啊?代表这是一个流...恩 我不是用fget去读的。我是在C里发出了一个http请求 然后调用系统的API去读,也许这个时候被转义了。好的,谢谢了,我再试试。
sighshadow 2013-06-27
  • 打赏
  • 举报
回复
引用 14 楼 snmr_com 的回复:
我有个疑问,你的php不会是发了header吧?什么header?
试过stream的header muti-byte的 好像都不行
sighshadow 2013-06-26
  • 打赏
  • 举报
回复
引用 11 楼 xuzuning 的回复:
不要开玩笑 你的依据何在?
然后C++部分是收到原始的数据 肯定不会转义,所以应该是php方面转义了。 我尝试了 echo pack("c1","13"); -- 显示收到的也是00 猜测应该是被转义了,但是苦于对php不熟...
sighshadow 2013-06-26
  • 打赏
  • 举报
回复
引用 11 楼 xuzuning 的回复:
不要开玩笑
你的依据何在?




看图 上为文件原文,下为C++内存调试部分 是不是就是少个0x0D.没有这个的片段都能对上。

php代码就下面三句话
<?php
echo file_get_contents("/var/www/SoundEng/good.mp3");
?>
xuzuning 2013-06-26
  • 打赏
  • 举报
回复
不要开玩笑 你的依据何在?
sighshadow 2013-06-26
  • 打赏
  • 举报
回复
引用 8 楼 xuzuning 的回复:
mp3 是压缩编码的,你要让他不是“噪音”,那就的一段一段的传全了
嗯 是啊。但是0x0D不会传输,被php当成空格去掉 我用pack("c1","13")也显示不了0x0D 导致我的数据不完整了。。
sighshadow 2013-06-26
  • 打赏
  • 举报
回复
嗯 是啊。但是0x0D不会传输,被php当成空格去掉 我用pack("c1","13")也显示不了0x0D 导致我的数据不完整了。。
xuzuning 2013-06-26
  • 打赏
  • 举报
回复
mp3 是压缩编码的,你要让他不是“噪音”,那就的一段一段的传全了
sighshadow 2013-06-26
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
问什么要有 0x0d ? 你不是 MP3 吗?没有 0x0d 不是很正常吗?
嗯 这个字符可能在mp3中不代表换行吧。因为好像没有这些字符 mp3就是噪音。他只是一个字节流 所以出现0x0D是很正常的吧,毕竟以字节算 也就0-FF这256种。 嗯,我的想法是假设文件大小是5000字节,那么传输5000字节,这样肯定就不会噪音吧。
xuzuning 2013-06-26
  • 打赏
  • 举报
回复
问什么要有 0x0d ? 你不是 MP3 吗?没有 0x0d 不是很正常吗?
sighshadow 2013-06-26
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
1、用 echo file_get_contents('文件名'); 无需考虑其他问题 2、用 readfile('文件名'); 无需考虑其他问题 3、客户端能否写文件,不是服务端能管的事情
下午试了一下午,我确定echo file_get_contents('文件名')应该也是有问题的。 我对比了十六进制数据 发现0D全都丢失了,也就是换行 我在客户端(C++)刚收到数据就开始打印,OD就都没有,应该是在发过来的时候 给转义了吧。 怎么不让这样的字符串转义呢?
xuzuning 2013-06-26
  • 打赏
  • 举报
回复
1、用 echo file_get_contents('文件名'); 无需考虑其他问题 2、用 readfile('文件名'); 无需考虑其他问题 3、客户端能否写文件,不是服务端能管的事情
Y.A.K.E 2013-06-26
  • 打赏
  • 举报
回复
yge.me/xx.mp3/index.php index.php <?php header("Location: http://yge.me/x.mp3"); //MP3的全部URL地址. //x.mp3为真正的文件 ?>
sighshadow 2013-06-26
  • 打赏
  • 举报
回复
引用 1 楼 snmr_com 的回复:
fopen 使用 'rb' 打开
嗯,试过了的..也不行的
ImN1 2013-06-26
  • 打赏
  • 举报
回复
fopen 使用 'rb' 打开

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧