0

我不知道如何写一个更好的标题。随意编辑。不知何故,我没有找到任何东西:

我有一个来自 PHP 的 cURL 请求,它返回一个 quicktime 文件。如果我想在浏览器窗口中输出流,这很好用。但我想发送它,因为它是一个真实的文件。如何传递标头并将其设置为脚本的输出,而无需将所有内容存储在变量中。

脚本如下所示:

if (preg_match('/^[\w\d-]{36}$/',$key)) {

    // create url
    $url        = $remote . $key;

    // init cURL request
    $ch         = curl_init($url);

    // set options
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
    curl_setopt($ch, CURLOPT_NOBODY, false);
    curl_setopt($ch, CURLOPT_BUFFERSIZE, 256);
    if (null !== $username) {
        curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password);
    }

    // execute request
    curl_exec($ch);

    // close
    curl_close($ch);
}

我可以看到这样的标题和内容,所以请求本身工作正常:

HTTP/1.1 200 OK X-Powered-By: Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.2 Java/Oracle Corporation/1.7) 服务器: GlassFish Server Open Source Edition 3.1.2 内容类型: video/quicktime传输编码:分块

4

3 回答 3

2

从 curl 查询中获取 Content-Type:

$info = curl_getinfo($ch);
$contentType = $info['content_type'];

并将其发送给客户端:

header("Content-Type: $contentType");
于 2012-08-07T11:59:10.200 回答
0

因此,在以前的答案的帮助下,我开始工作了。在我看来,它仍然有一个要求,但也许有人有更好的方法。

出现的问题在哪里:

1.) 当像这样使用 cURL 时:

curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);

标头未返回内容类型,而仅返回*\*.

2.) 使用curl_setopt($ch, CURLOPT_NOBODY, false);获得了正确的内容类型以及整个内容本身。所以我可以将所有内容存储在一个变量中,读取标题,发送内容。不知何故,这不是一个真正的选择。

get_headers($url, 1);因此,在获取内容之前,我必须使用一次请求标头。

3.) 最后,出现了 HTML5-video-tag 和 jwPlayer 都不想播放 'index.php' 的问题。因此,使用 mod_rewrite 并将 'name.mov' 设置为 'index.php' 它起作用了:

RewriteRule ^(.*).mov index.php?_route=$1 [QSA]

这是结果:

if (preg_match('/^[\w\d-]{36}$/',$key)) {

    // create url
    $url        = $remote . $key;

    // get header
    $header     = get_headers($url, 1);

    if ( 200 == intval(substr($header[0], 9, 3)) ) {
        // create url
        $url        = $remote . $key;

        // init cURL request
        $ch         = curl_init($url);

        // set options
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
        curl_setopt($ch, CURLOPT_NOBODY, false);
        curl_setopt($ch, CURLOPT_BUFFERSIZE, 256);
        if (null !== $username) {
            curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password);
        }

        // set header
        header('Content-Type: ' . $header['Content-Type']);

        // execute request
        curl_exec($ch);

        // close
        curl_close($ch);

        exit();
    }

}
于 2012-08-07T17:13:14.627 回答
0

尝试这个:

header ('Content-Type: video/quicktime');

在输出内容之前

于 2012-08-07T11:56:58.160 回答