【问题标题】:How do I remove the '\0' character that appears in a file after using fread?使用 fread 后如何删除文件中出现的 '\0' 字符?
【发布时间】:2012-12-23 12:45:17
【问题描述】:

我有一个视频文件,我需要使用函数而不是直接链接来获取它。 当我查看直接链接的视频页面代码时,这是我在屏幕上看到的:

但是当我使用我的功能时,首先视频不会运行,当我查看代码时,会出现:

我意识到这是同一个文件,相同的字符,但中间有许多 \0 字符。这些是黄色的。

这是我正在使用的代码:

$file_name = --path to file--;
$file_size = filesize($file_name);
$ctype = 'video/mp4';

header('Content-Type: '.$ctype);
header('Content-Length: ' . $file_size);
header("Accept-Ranges: bytes");    
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Pragma: no-cache');

$file = fopen($file_name, 'rb');
$read = fread($file, $file_size);
print($read);
fclose($file);
exit;

我需要更改代码吗?有什么东西可以让 fread 正确读取文件吗? 还是我需要对要显示的文件进行某种处理?

【问题讨论】:

  • NUL 字节存在于原始文件中,但您的浏览器不会显示它们,因为它们是 NUL 字节并且没有任何东西可以将它们呈现为。他们应该在那里。为什么你认为你需要删除它们?
  • 另请注意,由于您的代码没有努力处理字节范围,您应该删除 header("Accept-Ranges: bytes");
  • 因为视频没有显示所以数据肯定有问题。
  • @Martin curl 如何以任何方式应用于上述代码示例?
  • @Sarah 尝试使用readfile() 而不是fopen()/fread()/fclose() - 已经说过没有真正的原因为什么您的代码不应该工作(假设文件路径是正确) - 您应该(一次)确保 display_errors 关闭,以防 PHP 错误损坏文件。如果您在查看时遇到问题,请使用 VLC 打开它并在此处显示错误控制台中出现的消息。

标签: php video fread


【解决方案1】:

尝试使用readfile() 而不是fopen()/fread()/fclose()。它将更节省内存并且不易出错。

话虽如此,您的代码没有真正的原因(假设文件路径正确) - 您应该(一次)确保 display_errors 处于关闭状态,以防 PHP 错误损坏文件。您可以通过在脚本顶部设置ini_set('display_errors', 0); 来做到这一点。

【讨论】:

  • @Sarah 如果您正在处理/更喜欢处理文件指针,还值得一提的是fpassthru() 的存在。
  • @Sarah 另外,为了将来参考,您正在做的另一个常见问题是<?php ?> 标签之外的前导/尾随空格(应该没有)
  • 还有别的东西。我已经处理了要在播放时流式传输的视频文件。以前,整个文件需要在开始播放之前下载,但现在很好,使用直接链接,它在播放时流式传输,我可以在流式传输时来回移动位置,就像 youtube 视频一样。当我使用我的功能时,它也在播放时流式传输,但我无法移动指针的位置。当我移动它时,它会回到停止播放的位置。为什么会发生这种情况?
  • @Sarah 这可能与您发送的标头有关。添加 Content-Disposition: inline 标头可能会有所帮助。还要确保禁用输出缓冲。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2013-05-09
  • 2021-12-10
  • 1970-01-01
相关资源
最近更新 更多