0

readfile() を使用して大きなファイル (1.3gb) をダウンロードするスクリプトがあります。

スクリプトだけで .php ページを作成すると問題なく動作しますが、同じスクリプトをスニペットに配置してページに配置しても何も起こりません。

ModX はどのようにダウンロードをブロックしていますか? どんなアドバイスもありがとう!

編集コード:

$file = $_SERVER['DOCUMENT_ROOT']."/movie.mov";
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
};
4

1 に答える 1

0

Modx には最大ファイル サイズの設定 [Maximum upload size upload_maxsize] がありますが、それはファイル マネージャー用です。それがあなたの問題だとは思いません。

スクリプトとエラー ログを見てみましょう。

アップデート

あなたの小さなスニペットをテストしました [いくつかのマイナーな変更を加えて] ~ 正常に動作します。

$base_path = $modx->config['base_path'];

$movie = 'frankenweenie-mrwhiskers_r640s.mov';

$file = $base_path.$movie;


if (file_exists($file)) {

    echo 'file exists '.filesize($file);

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);

    return true;

}else{

    echo 'file does not exist';

    return false;

}

$modx->config['base_path'] を使用することは問題ではありません。サーバー変数を使用しても機能しました。これは良い習慣です。true/false を返す modx は、スニペットが true、false、または $output のいずれかを返すことを期待しています... また、問題なく機能したわけではありません。

PHP の設定を調べてみると、メモリ制限が問題になっている可能性があると思います。PHP ドキュメントを確認し、そのサイズのファイルを読み取るのに十分なメモリが必要かどうかを確認してください。[「サイズは関係ありません」と表示されていますが]

スクリプト自体でエラー ログを有効にし、サーバー エラー ログを確認します。

小さなファイルで動作しますか?次に、ここを見てください: PHP readfile() と大規模なダウンロード

幸運を!

于 2012-10-09T01:04:16.843 に答える