readfile()不使用远程资源

时间:2015-05-25 13:55:13

标签: php readfile

所以我遇到了一个我的项目有点问题。我们有一个拥有大量空间的庞大服务器以及一个可以 用于存储东西的轻型静态存储服务器。我们需要确保只有经过身份验证的人才能访问静态服务器上的资源,所以我考虑用readfile()创建一个伪代理,因为我们可以使用allow_url_fopen。

所以我尝试了以下代码作为测试:

<?php
$type = "video/webm";
$loc = "http://a.pomf.se/fzggfj.webm";
header('Content-Type: '.$type);
header('Content-Length: '.filesize($loc));
readfile($loc);
exit;

这总是失败,浏览器将其视为已损坏。有趣的是,当你这样做时:

<?php
$type = "video/webm";
$loc = "../test.webm";
header('Content-Type: '.$type);
header('Content-Length: '.filesize($loc));
readfile($loc);
exit;

它确实有效,即使文件完全相同。有谁知道为什么readfile不能正确地做到这一点,并向我解释一下?

编辑: 我收到了它的错误消息,它被卡在文件中。

  

警告:第5行的C:\ uniform \ UniServerZ \ www \ director.php中的http://a.pomf.se/fzggfj.webm的filesize():stat失败

filesize()是我的问题吗?

3 个答案:

答案 0 :(得分:1)

好的我修好了。 deceze是正确的,文件大小是问题。让记录显示我认为filesize对远程资源不起作用。

答案 1 :(得分:0)

您需要在allow_url_fopen=1中添加php.ini来激活allow_url_fopen

答案 2 :(得分:-1)

为什么您没有将视频下载到临时目录并将用户重定向到那里? (当然你可以用cron脚本清除过时的tmp目录) 试试这个:

<?php
$loc = "http://a.pomf.se/fzggfj.webm";

$pathToVideos = dirname(__FILE__).'/tmp/';
$ext = explode('.', $loc);
$ext = end($ext);
$hash = md5($loc);

$filename = $hash.'.'.$ext;
$tmpFile = $pathToVideos.$filename;
if(!is_file($tmpFile)) {
    exec('wget -O '.escapeshellarg($tmpFile).' '.escapeshellarg($loc));
}

header('Location: /tmp/'.$filename);
exit(0);