readfile()不适用于某些URL

时间:2012-11-01 15:59:46

标签: php url readfile

以下代码没有为我提供正确的文件:

<?php
header("Content-Type: application/octet-stream");
readfile("http://player.vimeo.com/play_redirect?clip_id=24195442&sig=49daac0ff885745c27601a80402bba14&time=1351783454&quality=hd&codecs=H264&type=moogaloop_local&embed_location=");
?>

相反,它似乎下载http://player.vimeo.com/play_redirect?clip_id=24195442。 我尝试过使用 htmlentities htmlspecialchars ,但它没有改变任何内容。

2 个答案:

答案 0 :(得分:0)

这在视频和下载网站上很常见。为了防止琐碎的直接链接或热链接,他们在用户与页面,视频播放器或CAPTCHA交互后为主数据生成唯一的URL。这就是您的网址的sigtime部分。生成的此类URL通常通过IP地址与用户绑定,并在一段时间后过期。

要传递这种类型的内容,您必须解密用于生成视频网址的步骤。这通常就像请求HTML页面然后在Flash applet参数或脚本标记中查找URL一样简单。其他站点在复杂的客户端脚本或Flash小程序中生成URL。

我快速浏览了Vimeo并想出了如何获取URL,它似乎工作正常。试试这个:

$clipId = 24195442;

ini_set('user_agent', 'Mozilla/5.0 (Windows NT 6.1; rv:10.0.9) Gecko/20100101 Firefox/10.0.9');
$config = json_decode(file_get_contents('http://player.vimeo.com/config/' . $clipId));
$videoUrl = 'http://player.vimeo.com/play_redirect?clip_id=' . $clipId .
    '&sig=' . $config->request->signature .
    '&time=' . $config->request->timestamp;
header('Content-Type: application/octet-stream');
readfile($videoUrl);

是的,您必须设置User-Agent字符串。当Vimeo看起来不像真正的浏览器时,它拒绝了它。

我不知道是否有一个Vimeo API说明假设可以工作。请注意,只要Vimeo不改变其网站结构,它可能只会起作用。最可靠的做法是保存或缓存视频文件,并在可能的情况下从您自己的服务器本地提供。

答案 1 :(得分:0)

尝试这个例子,基于Vimeo Simple API(版本2)。只需复制并粘贴即可自行试用...

http://www.lib.montana.edu/~jason/files/api/vimeo/item.txt

如果需要,检查是否有注释的行使用curl_init()方法。 从第57行开始,最后在第69行。但如果第一次运行示例,则忽略它。