1

以下のコードでいくつかのテストを行った後、次の結論に達しました。

  • このスクリプトは、Firefox と Chrome の両方で AVI ファイルに対して正常に動作します (もちろん、コンテンツ タイプをビデオ/avi に変更した場合)
  • このスクリプトは、Chrome の MKV ファイルに対して正常に機能します。ただし、Firefox は私の顔にエラー メッセージをスローします (以下を参照)。
  • 小さなファイルでテストするために、http: //matroska.org/downloads/test_w1.html から 20 MB の大きなテスト ファイル (test7.mkv) をダウンロードしました。奇妙なことに、Firefox はそのファイルをダウンロードでき、動作しているようです。ただし、6 GB の大きなファイルで試してみると、以下に示すように firefox エラーが発生します。
  • 編集: 700 mb のファイルをダウンロードしました。SM プレーヤー (終了コード 1) ではまったく再生されませんでしたが、VLC プレーヤーでは正常に再生されました。現在、ファイルが破損している可能性がある方法と場所を見つける方法を探しています。

私の明らかな質問は次のとおりです。私は何を間違っていますか? Firefox またはそれ以上の一般的なブラウザで mkv ファイルを適切にダウンロードする方法。グーグルで役立つものは何も見つかりませんが、間違った場所を探しているだけかもしれません。

mkv ファイルをダウンロードしようとしたときの Firefox エラー:

破損したコンテンツ エラー

データ転送にエラーが発生したため、表示しようとしているページを表示できません。

データ送信でエラーが検出されたため、表示しようとしているページを表示できません。この問題について Web サイトの所有者に連絡してください。

    function download($file)
    {
        $path = $_SERVER['DOCUMENT_ROOT']; //<-- added the relative part after that 
        $fullPath = $path.$file;
        set_time_limit(0);
        if ($fd = fopen ($fullPath, "r")) 
        {
        $fsize = filesize($fullPath);
        $path_parts = pathinfo($fullPath);
        $ext = strtolower($path_parts["extension"]);

        header("Cache-Control: public");
        header("Content-Description: File Transfer");
        header("Content-Type: video/x-matroska");
        header("Content-Disposition: attachment; filename=\"$file\""); 
        header("Content-Transfer-Encoding: binary");
        header("Content-length: $fsize");

        $file = @fopen($fullPath,"rb");
        if ($file) 
        {
            while(!feof($file)) 
            {
                print(fread($file, 1024*8));
                flush();
                if (connection_status()!=0) 
                {
                    @fclose($file);
                    die();
                }
            }
            @fclose($file);
        }
        exit;
    }
}
4

2 に答える 2

0

サーバー上のmkvファイルへの絶対パス

filenameFirefoxがヘッダー値の絶対パスを窒息させている可能性があります。

代わりに、単なるファイル名を指定してみてください。

 $filename = pathinfo($filePath, PATHINFO_BASENAME);
 header("Content-Disposition: attachment; filename=\"$filename\"");
于 2012-03-06T21:27:12.967 に答える
0

解決:

定義した変数が期待値に設定されているかどうかを確認する必要がありました。filesize()は、32ビットのsignedintを返します。

今のところ私はここに示されている関数を取りました:https ://stackoverflow.com/a/5502328/1232791

他の可能な解決策は、コンテンツの長さのヘッダーを定義しないことです。このソリューションを使用すると、クライアントはダウンロードにかかる時間がわかりません。

于 2012-03-07T14:30:53.303 に答える