web-dev-qa-db-ja.com

s3Amazonサーバーからの強制ダウンロード

私は、ストレージシステムとしてAmazon S​​サーバー、PHPフレームワーク)としてCodeiginterに依存する新しいWebアプリケーションを開発してきました。

リンクがクリックされたときにファイルを強制的にダウンロードする必要があります。元のURLは次のようになります。

_http://www.our-web.com/download/do/1.jpg_

これは、次のようにAmazonS3サーバー上の実際のファイルへの一時的な署名付きURLを生成します。

_http://main_bucket.s3.amazonaws.com/post/1/1.jpg?AWSAccessKeyId=AKIAJEOQKYPKC3CCU5RA&Expires=1305395426&Signature=iuzCdA22gImLK192%2BMAhk8OkAY8%3D_

ユーザーがリンクをクリックするとすぐに、実際のAmazonURLからファイルのダウンロードを開始する必要があります。

私は今そうするために2つの方法があります:

  1. redirect()を使用すると、ファイルはダウンロードされずに開きます。または
  2. このコードのようにヘッダーを変更します。

    _header('Content-type: application/force-download');
    header('Content-Disposition: attachment; filename=' . $file_name);
    header('Content-Transfer-Encoding: binary');
    header('Expires: 4000');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($generated_file));
    
    readfile($generated_file);
    _

残念ながら、どちらの方法も役に立ちません。 2番目の方法では、Amazonから直接ではなく、私のWebサイトからダウンロードします。

ウェブサイトからではなく、Amazon S3サーバーからファイルを直接ダウンロードするにはどうすればよいですか?

21
Khaled

ファイルを開くのではなく、ブラウザに強制的にダウンロードさせるには、S3でファイルに正しいヘッダーを設定する必要があります。これらを設定します:

Content-Disposition: attachment; filename=FILENAME.EXT
Content-Type: application/octet-stream

ファイルをS3にアップロードするときに設定する必要があります。 php SDK を使用すると、 create_object

または、アップロード後にこれらを設定するには、S3で 'change_content_type' を使用するか、 ファイルをそれ自体にコピー して、正しいヘッダーを設定します。

31
Geoff Appleford

パーティーに少し遅れますが、多くの場合、ファイルを使用する場合は、保存時にファイルの使用方法を決定する必要はありません。ファイルを一度保存​​してから、ある領域にファイルを埋め込んだり、ブラウザに表示したり、別の領域でユーザーが同じファイルをダウンロードできるようにしたい場合があります。

幸い、リクエストURLにオーバーライドパラメータを指定することで、これを行うことができます。署名されたリクエストでのみ機能しますが、ありがたいことに、すでにそれを行っています。

&request-content-type="application/force-download"のようなパラメータを追加すると、うまくいくはずです。

S3 GETオブジェクトドキュメントのリクエストパラメータセクションを確認してください: http://docs.aws.Amazon.com/AmazonS3/latest /API/RESTObjectGET.html

15
Tom McQuarrie

問題は、これをプログラムで設定することですが、AWSコンソールから手動で設定することです。

  • S3でファイルを選択します。
  • プロパティ>メタデータ>メタデータを追加
  • キー:コンテンツ-廃棄値:添付ファイル
  • セーブ
10
some ideas

S3 WebサイトがCloudFrontの背後にある場合は、再試行する前にファイルを無効にすることを忘れないでください。これにより、キャッシュされたファイルがクリアされます。

次の場所に移動すると、無効化ページにアクセスできます。

Cloudfront -> Distribution Settings -> Invalidation

次に、ファイルへのパスを入力します。

ファイルの無効化には時間がかかります。私のファイルの場合、5分かかりました。

0
Parag