10

ユーザー向けに独自のダウンロード リンクをいくつか作成したいと考えています。その理由は、同じリンクを使用して再度ダウンロードできるように、一度だけダウンロードできるようにしたかったからです。

私はいくつかのキーを生成しました (たとえば、qwertyasdfghzxcbn。ダウンロード リンクのように、www.xxxxx.com/download.php?qwertyasdfghzxcbn のようになります) データベースとフラグ フィールドで、ユーザーがダウンロードしたときに 1 を更新します。フラグフィールドへ。

ネットで検索したところ、これにたどり着きました。 http://www.webvamp.co.uk/blog/coding/creating-one-time-download-links/

ただし、最初にページに移動した場合にのみ機能し、そのページのみが一意のリンクを生成します。データベース内でリンクを事前に生成しています。再度生成する必要はありません。実際、ユーザーがページに移動したときにキーを生成すると、ページを更新することで複数回ダウンロードできるようになります。

4

2 に答える 2

9

解決策は、リンク ターゲット自体を PHP スクリプトにすることです。

実際のファイルをブラウザからアクセスできない場所 (つまり、 経由fopen()でファイルにアクセスできるが、ドキュメント ルート内ではない場所) に隠し、download.php ファイルを配置してファイルをダウンロードします。

ダウンロード スクリプト自体は次のようになります。

$fileid = $_REQUEST['file'];
$file = file_location($fileid); // you'd write this function somehow
if ($file === null) die("The file doesn't exist");
$allowed = check_permissions_for($file, $fileid) // again, write this
// the previous line would allow you to implement arbitrary checks on the file
if ($allowed) {
  mark_downloaded($fileid, $file); // so you mark it as downloaded if it's single-use
  header("Content-Type: application/octet-stream"); // downloadable file
  echo file_get_contents($file);
  return 0; // running a return 0; from outside any function ends the script
} else
  die("You're not allowed to download this file");

あなたが指すリンクは、単純に download.php?fileid=712984 を指します (ファイル ID が実際に何であれ)。そのスクリプトはファイルを転送するため、これが実際のダウンロード リンクになります。ただし、ユーザーがそれを取得できる場合に限ります。file_location()ただし、関数check_permissions_for()mark_downloaded()関数は自分で作成する必要があります。

于 2013-09-18T08:43:20.090 に答える
0

uniqid() 関数を使用することをお勧めします。一意の ID と有効期限をデータベースに保存し、次のようなものでユーザー URL に戻ります: ...?file_id=$id

リンクが開かれているときは、データベースから削除するか、「すぐに」削除するようにマークすることができます (ユーザーがページを更新したい場合に備えて)。

于 2013-09-18T08:36:18.910 に答える