php-s3アマゾンサーバーからの強制ダウンロード
ストレージシステムとしてAmazonS3 サーバーに依存し、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
を使用します。
または、'change_content_type' を使用してアップロードした後、またはS3でファイルをそれ自体にコピーして正しいヘッダーを設定することにより、これらを設定できます。
答え :
解決策:
パーティーに少し遅れますが、多くの場合、ファイルを使用する場合は、保存時にファイルの使用方法を決定する必要はありません。ファイルを一度保存してから、ある領域でファイルを埋め込んだり、ブラウザに表示したり、別の領域でユーザーが同じファイルをダウンロードできるようにしたい場合があります。
幸い、リクエストURLにオーバーライドパラメータを指定することでこれを行うことができます。署名されたリクエストでのみ機能しますが、ありがたいことに、すでにそれを行っています。
&request-content-type="application/force-download"
のようなパラメータを追加するとうまくいくはずです。
S3GETオブジェクトドキュメントのリクエストパラメータセクションを確認してください。 http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html
答え :
解決策:
問題はこれをプログラムで設定することですが、AWSコンソールから手動で設定することです:
- S3でファイルを選択します。
- プロパティ>メタデータ>メタデータを追加
- キー:コンテンツ-廃棄値:添付ファイル
- 保存
答え :
解決策:
S3 WebサイトがCloudFrontの背後にある場合は、再試行する前にファイルを無効にすることを忘れないでください。これにより、キャッシュされたファイルがクリアされます。
次の場所に移動すると、無効化ページにアクセスできます。
Cloudfront -> Distribution Settings -> Invalidation
次に、ファイルへのパスを入力します。
ファイルの無効化には時間がかかります。私のファイルの場合、5分かかりました。
答え :
解決策:
リモートファイルの処理方法をブラウザに指示することはできません。アマゾンにリダイレクトすることで、ブラウザに新しいリクエストを開始するように指示します。そのリクエストを制御することはできません。
私が考えることができる唯一の解決策は、画像をzipファイルなどにパッケージ化することです。もちろん、それは別の(おそらく厄介な)形式の複雑さを追加します。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。