2017-08-08 3 views
0

ブラウザでファイルにリダイレクトするのではなく、バックラウンドでファイルをダウンロードするには次のコードを実行していますが、ファイル全体が表示されるまでダウンロード。それを修正するためにコードで変更できるものは何ですか?PHPダウンロードで他のものがフリーズする

リンクをクリックすると、ファイルが($ファイルパス)からフェッチされ、それはまた、セッションで保護されています場所、ユーザーが見ていないので、これは、別のPHPファイルにロードされます。

header("Cache-control: private"); 
header("Content-Type: application/octet-stream"); 

if ($download) { 
     header("Content-Disposition: attachment; filename=\"" . $title . "\""); 
     header('Content-Transfer-Encoding: binary'); 
} else { 
     header("Content-Disposition: inline; filename=\"" . $title . "\""); 
} 

// Disable caching 
header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1. 
header('Pragma: no-cache'); // HTTP 1.0. 
header('Expires: 0'); // Proxies. 

readfile($filepath); 

Edit //私はまだこれを理解することができませんでした。今私はこのAJAXコードで試していますが、ファイルが完全にダウンロードされ、ハードドライブではなくバックグラウンドで読み込まれるまでページ全体がロックされます。

$('.download').on('click', function(e) { 
    e.preventDefault(); 
    var self = $(this); 
    $.ajax({ type: 'POST', 
     url: self.attr('href'), 
     async: true, 
     success : function(response) 
     { 
     } 
    }) 
}); 
+0

は、あなたがローカルで作業しているビルトインのdevのサーバー?シングルスレッドなので、一度に1つのリクエストしかアクティブにできません。 – ceejayoz

+0

ローカルサーバーとDigital Oceanサーバーの両方で同じことが起こります。 – SeaBass

+0

jqueryまたはjavascriptの使用はどうですか? – user10089632

答えて

2

免責事項:下記の内容はすべて、デフォルトのファイルベースのセッションで有効です。他のハンドラにとっては、それは真実ではないかもしれません。

セッションがブロックされます:1つのページにセッションが開いたら、同じセッションIDの他のページは提供されません。

解決策は、完了したらすぐにセッションを閉じることです。

だから、あなたのファイルを提供開始直前

session_write_close(); 

を置きます。

ファイルが完全にダウンロードされていなくても、そのファイルを処理するページのセッションを終了し、その後に他のページを処理することができます。

参考文献:

+0

うわー、私はそれだと思います!素晴らしい!ありがとうございました。私はもう少しそれをテストしますが、私はそれを解決することはかなり確信しています。 – SeaBass

関連する問題