所以我遇到了一个我的项目有点问题。我们有一个拥有大量空间的庞大服务器以及一个可以 用于存储东西的轻型静态存储服务器。我们需要确保只有经过身份验证的人才能访问静态服务器上的资源,所以我考虑用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()是我的问题吗?
答案 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);