私は、ストレージシステムとして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つの方法があります:
redirect()
を使用すると、ファイルはダウンロードされずに開きます。またはこのコードのようにヘッダーを変更します。
_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サーバーからファイルを直接ダウンロードするにはどうすればよいですか?
ファイルを開くのではなく、ブラウザに強制的にダウンロードさせるには、S3でファイルに正しいヘッダーを設定する必要があります。これらを設定します:
Content-Disposition: attachment; filename=FILENAME.EXT
Content-Type: application/octet-stream
ファイルをS3にアップロードするときに設定する必要があります。 php SDK を使用すると、 create_object
。
または、アップロード後にこれらを設定するには、S3で 'change_content_type' を使用するか、 ファイルをそれ自体にコピー して、正しいヘッダーを設定します。
パーティーに少し遅れますが、多くの場合、ファイルを使用する場合は、保存時にファイルの使用方法を決定する必要はありません。ファイルを一度保存してから、ある領域にファイルを埋め込んだり、ブラウザに表示したり、別の領域でユーザーが同じファイルをダウンロードできるようにしたい場合があります。
幸い、リクエストURLにオーバーライドパラメータを指定することで、これを行うことができます。署名されたリクエストでのみ機能しますが、ありがたいことに、すでにそれを行っています。
&request-content-type="application/force-download"
のようなパラメータを追加すると、うまくいくはずです。
S3 GETオブジェクトドキュメントのリクエストパラメータセクションを確認してください: http://docs.aws.Amazon.com/AmazonS3/latest /API/RESTObjectGET.html
問題は、これをプログラムで設定することですが、AWSコンソールから手動で設定することです。
S3 WebサイトがCloudFrontの背後にある場合は、再試行する前にファイルを無効にすることを忘れないでください。これにより、キャッシュされたファイルがクリアされます。
次の場所に移動すると、無効化ページにアクセスできます。
Cloudfront -> Distribution Settings -> Invalidation
次に、ファイルへのパスを入力します。
ファイルの無効化には時間がかかります。私のファイルの場合、5分かかりました。