私の知る限り、S3 からのダウンロードの現在のステータスを確認する方法はありません。そうは言っても、S3 は実際に十分な帯域幅を利用できるので、サーバーの過負荷についてあまり心配する必要はありません :) 先週、Amazon は、S3 が現在平均 650,000 オブジェクト/秒を処理していると発表しました。
PHP で @Pushpesh のソリューションのようなものを実装したい場合、1 つの解決策は、Amazon SDK for PHP を使用して次のようにすることです。
<?php
#Generate presigned S3 URL to download S3 object from
# Include AWS SDK for PHP and create S3
require_once("./aws-sdk/sdk.class.php");
$s3 = new AmazonS3();
# Let S3 know which file we want to be downloading
$s3_bucket_name = "yours3bucketname";
$s3_object_path = "folder1/object1.zip";
$s3_url_lifetime = "10 minutes";
$filename = "download.zip";
#Check whether the user has already downloaded a file in last two hours
$user_can_download = true;
if($user_can_download) {
$s3_url = $s3->get_object_url($s3_bucket_name, $s3_object_path, $s3_url_lifetime, array('response' => array('content-type' => 'application/force-download', 'content-disposition' => 'attachment; filename={$filename}')));
header("Location: {$s3_url}");
}
else {
echo "Sorry, you need to wait a bit longer before you can download a file again...";
}
?>
これは get_object_url 関数を使用します。この関数は、S3 で非公開に設定したファイルを公開せずに他のユーザーがダウンロードできるようにする署名付き URL を生成します。
ご覧のとおり、これが生成するリンクは 10 分間のみ有効で、一意のリンクです。したがって、人々がリンクを拡散することを心配することなく、このリンクから人々が安全にダウンロードできるようにすることができます。リンクは期限切れになります。人々が新しい有効なリンクを取得できる唯一の方法は、ダウンロード スクリプトを実行することです。これは、ダウンロードを開始しようとしている IP/ユーザーが既に使用制限を超えている場合、新しいリンクの生成を拒否します。ただし、これらのファイルを S3 で非公開に設定することが重要です。これらのファイルを公開すると、あまり効果がありません。これらの署名付き URL を生成する S3 APIのドキュメントも参照してください。