5

AmazonのS3にファイルがあります。それらは一意のIDで名前が付けられているため、重複はありません。許可されたURLを使用してアクセスしています。それらをブラウザに渡すことができる必要がありますが、名前を変更する必要があります。現在、fopenを使用していますが、ファイルをブラウザに提供する前に、ファイルをサーバーにダウンロードしています。ファイルをサーバーからブラウザに「パススルー」させるにはどうすればよいですか?または、ダウンロードをバッファリングするにはどうすればよいですか?サーバーに小さなチャンクをダウンロードし、次のチャンクをダウンロードするときにそれをブラウザに渡しますか?

また、CloudFrontを本当に使用したいのですが、認証されたURLを提供していません。CURLを使用してリクエストのクレデンシャルを送信できると思います-CURLでこの種の「パススルー」ファイルを提供できますか?

ありがとう!

4

3 に答える 3

5

私は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シークレットアクセスキーが漏洩するリスクはありません。

于 2009-04-21T14:07:58.627 に答える
1

http_getとrequest_optionsを使用してhttpauthとhttpauthtypeを指定してみましたか?このメソッドが文字列の有効な型を想定しているかどうかは覚えていませんが、バイナリではうまく機能しない可能性があります。

それが成功した場合は、正しいMIMEタイプを指定して、ブラウザーに書き出すことができるはずです。

于 2009-04-21T13:24:27.793 に答える
0

readfile( " http:// username:password@host/filename.ext ")を使用してbuを試しましたか?

これはバイパスして出力バッファに直接書き込むだけですが、content-typeが問題になる場合は、最初にそれを確認する必要があります。

readfileの引数としてenURLを使用するには、PHPがurlwrapper-supportでコンパイルされている必要もあります。

于 2009-04-22T16:28:58.730 に答える