私はS3がどのように機能するかをよく知らないので、この解決策が可能かどうかわかりません。しかし、単にユーザーのブラウザをファイルにリダイレクトすることはできませんか?私が正しく理解していれば、S3ではバケット内の任意のファイルのWebURLを作成できます。したがって、たとえば、これらが有料ダウンロードである場合、S3にそのダウンロードの一時URLを生成させ、ユーザーがダウンロードしたらそれを削除することができます。
それがオプションでない場合は、次のPHPクラスを試すことができます。
- HTTPプロトコルクライアント-HTTPリソースへのリクエストを実装するクラス(以下のストリームラッパーで使用)。リクエストのストリーミングを許可します。
- gHttp-
fopen()
、fread()
などの関数を使用して、リモートHTTPリソースをファイルとして処理できるHTTPストリームラッパー。
- AmazonS3ストリームラッパー-gHttpと同じ開発者によるAmazonS3ストリームラッパー。また、を介して通常のファイルのようにリモートリソースにアクセスできるようにします
fopen('s3://...')
。
編集:
このページには、URLに認証キーをエンコードしてリクエストを「事前認証」する方法に関する情報があります。これは、「クエリ文字列要求認証の代替」というタイトルのセクションの下にあります。
// I'm only implementing the parts required for GET requests.
// POST uploads will require additional components.
function getStringToSign($req, $expires, $uri) {
return "$req\n\n\n$expires\n$uri";
}
function encodeSignature($sig, $key) {
$sig = utf8_encode($sig);
$sig = hash_hmac('sha1', $sig, $key);
$sig = base64_encode($sig);
return urlencode($sig);
}
$expires = strtotime('+1 hour');
$stringToSign = getStringToSign('GET', $expires, $uri);
$signature = encodeSignature($stringToSign, $awsKey);
$url .= '?AWSAccessKeyId='.$awsKeyId
.'&Expires='.$expires
.'&Signature='.$signature;
次に、ユーザーをにリダイレクトするだけで$url
、ファイルをダウンロードできるようになります。署名は一方向暗号化スキーム(sha1)でエンコードされているため、AWSシークレットアクセスキーが漏洩するリスクはありません。