0

javascript と php でダウンロード スクリプトを作成しました。それは機能しますが、大きなファイル (例: 1GB zip ファイル) をダウンロードしたい場合は、リクエストを処理するには長すぎます。ファイルを読んだことには何か関係があると思います。これである場合、それをより速く取得する方法はありますか?
注意: ヘッダーが必要です。これは、画像、PDF、あらゆる種類のファイルタイプなどの強制ダウンロードの原因です。

JS はとてもシンプルです。これを見てください:

function downloadFile(file){
    document.location.href = "script.php?a=downloadFile&b=."+ file;
}

PHP はまだ単純です。

function downloadFile($sFile){
    #Main function
    header('Content-Type: '.mime_content_type($sFile)); 
    header('Content-Description: File Transfer');
    header('Content-Length: ' . filesize($sFile)); 
    header('Content-Disposition: attachment; filename="' . basename($sFile) . '"');
    readfile($sFile);
}

switch($_GET['a']){

    case 'downloadFile':
        echo downloadFile($_GET['b']);
        break;
}
4

1 に答える 1

3

バッファリングが大きなファイルの問題だと思います。ファイルを小さなチャンク (メガバイトなど) で読み取り、各チャンクを印刷した後にフラッシュ関数を呼び出して出力バッファーをフラッシュしてみてください。

編集:ええ、わかりました、これがあなたが試すべきコード例です:

function downloadFile($sFile){
    #Main function

    if ( $handle = fopen( $sFile, "rb" ) ) {
        header('Content-Type: '.mime_content_type($sFile)); 
        header('Content-Description: File Transfer');
        header('Content-Length: ' . filesize($sFile)); 
        header('Content-Disposition: attachment; filename="' . basename($sFile) . '"');

        while ( !feof($handle) ) {
            print fread($handle, 1048576);
            flush();
        }
        fclose($handle);
    } else {
        header('Status: 404');
        header('Content-Type: text/plain');
        print "Can't find the requested file";
    }
}
于 2013-03-04T14:35:46.097 に答える