0

より良いタイトルを書く方法がわかりません。自由に編集してください。どういうわけか私はこれについて何も見つかりませんでした:

クイックタイムファイルを返すPHPからのcURLリクエストがあります。ブラウザのウィンドウにストリームを出力したい場合、これは問題なく機能します。でも本物のファイルなので送りたいです。すべてを変数に格納する必要なしに、ヘッダーを渡してスクリプトの出力に設定するにはどうすればよいですか。

スクリプトは次のようになります。

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:サーブレット/3.0JSP/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

これを試して:

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

コンテンツを出力する前に

于 2012-08-07T11:56:58.160 に答える
0

それで、前の答えの助けを借りて、私はそれを機能させました。それでも私の意見では多くのことに対する1つの要求がありますが、おそらく誰かがより良いアプローチを持っています。

ここで発生した問題:

1.)次のようにcURLを使用する場合:

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

ヘッダーはcontent-typeを返しませんでしたが、。のみを返しました*\*

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 に答える