2016-07-25 7 views
2

私はファイルをダウンロードしたいボタンを持ったPHPファイルを持っています。これはPHPにAJAX呼び出しを使って試してみたいさて、これは何も最初の呼び出しということですユーザがファイルをダウンロードしたかどうかを知る方法

function download_file (fileid) 
{ 
    $.ajax 
    ({ 
    type: "POST", 
    url: 'download.php', 
    data: {id: fileid}, 
    success: function(data) 
    { 
    window.location = 'download.php?link='+data; 
    } 
    }); 
} 

<a onclick="download_file (<?= $row["id"]?>)">Download</a> 

...現在、私は次のコードを持っている、)それはより安全であると感じそしてDOWNLOAD_FILEの機能は、次のようになります POST要求を伴う download.php(場所を少し安全に保つため) fileidを使用して、スクリプトがデータベースからファイルの場所を取得し、AJAXスクリプトに戻します( data変数)。

さて次は何の成功の機能では、download.phpが再び呼び出されていることであるが、今回GET要求と、そのファイルは、検索名前を変更(サーバーのように、彼らはランダムなファイル名を持っている)してからダウンロードされます...そのためのPHPコードは次のとおりです。

header("Cache-Control: private"); 
header("Content-Description: File Transfer"); 
header("Content-Disposition: attachment; filename=".$file.""); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Type: binary/octet-stream"); 
readfile ($link); 

は、すべてが完璧に動作し、私の懸念はセキュリティについてですが、私は私が後にランダムでユニークなダウンロードリンクのようなものが生成されたいと、ファイルをより安全にしたいですダウンロードが完了したら、リンクはオフになっていますが、ファイルはそのまま残ります...私は別のアドレスで一時ファイルを作成し、一時ファイルを削除するためにcronジョブを使用する方法を考えましたが、しかし、それはcronジョブの時間間隔のその特定の量についてある程度時間の窓を与え、ダウンロードリンクは静的であり、サイトには適していません...私は単一のリンクが1回のダウンロードに対して有効であることを望みます(しかし、リンクはダウンロード全体のためにそこにあるはずです、すなわち、再開はサポートされるべきです)。

可能であれば、ユーザーがログインしている場合と同様に、認証を使用することもできますが、ダウンロードリンクはアクティブになりますが、ユーザーがアプリからログアウトしてダウンロードリンクを開くとすぐにどちらかログインにユーザを促したり404エラーを表示...

そして、私はまた、他の方法で同じのセキュリティを改善する方法の提案をしたい...

答えて

2

プロキシを作成する必要がありますあなたのdownload.phpが呼び出される前に呼び出されます。基本的にはあなたのプロキシは、次のことを行います。

  1. は、セッションに基づいてユーザを認証します。
  2. UNIQUEダウンロードリンクを生成します。このためには、ユーザーと新しく生成されたリンクとの間にある種のマッピングを維持する必要があります。
  3. パラメータとして渡されるこの新しく生成されたリンクを、successコールバック関数に渡します。
  4. AJAXはdownload.phpリンクを呼び出し、ファイルのダウンロードを開始します。あなたはデータベースと他のどこかのユーザとダウンロードリンクの間で作成したマッピングを使って、download.phpの使用をもう一度再認証する必要があります。いくつかのダウンロード履歴を維持する必要があるので、私はデータベースを使用することを好むでしょう。
  5. ダウンロードが完了したら、このマッピングをあなたのDBに非アクティブとしてマークし、ユーザーがこのURLに再度アクセスしようとすると何らかの404ページなどにリダイレクトします。
+0

しかし、ユーザーがダウンロードを完了したことをどのように知っていますか? –

+0

ダウンロードプロセスがクライアント側/ブラウザ上で完全に処理されるため、それを理解する方法はないと思います。ユーザーがダウンロードプロセスを開始した場合、ユーザーがファイルをダウンロードしたと想定するのが最も近い方法です。 – pioneer

+0

しかし、私は10 MBの大きさのファイルを持っていますが、ユーザーのインターネット速度が本当に悪い場合、Kb/sのようにうまくいきます。その場合、ダウンロードは失敗します。 t完了...だから、転送は全くありません... –

関連する問題