0

別のサイトからAPIを介して画像を取得し、その画像をサーバーにローカルに保存するプロジェクトに取り組んでいます。私は考えていましたが、画像を表示するローダーを作成するか、特定の画像に直接アクセスするかを決めることができませんか?それらに直接アクセスする場合、セキュリティ上の懸念はありますか?サーバーに画像を保存する前に、コンテンツを検証し、それが有効な画像であるかどうかを確認します。これにより、常に有効な画像を表示できます。

イメージローダーはこのように機能します。コントローラを作成します(たとえば、「ロード」と呼びます)。次に、画像をパラメータとしてloadを呼び出すことができます。これは、次のようなものです。

http://example.com/load/file_name.jpg

次に、ロードコントローラから画像を取得して表示します。そうすることには利点がありますか、それとも画像に直接アクセスしても大丈夫ですか?

4

3 に答える 3

1

説明した画像ローダーには、表示される画像ごとにフレームワークをインスタンス化する必要があるという明らかな欠点があります。より良い代替手段は、画像に必要な変更(透かし、サイズ変更、キャッシュ)を実行し、画像のURLを出力して、フレームワークを追加で呼び出さなくてもWebサーバーから画像を配信できるようにする画像ヘルパーです。

于 2012-10-04T21:16:53.907 に答える
1

PHPを介して送信された場合、画像が改善されることはありません。データは同じであり、指定されたユーザーグループ(別名パブリックアクセス)へのアクセスを制限する必要がない場合は、直接アクセスを選択します。

于 2012-10-04T21:18:34.313 に答える
0

誰か(この場合は私)がPHPを介して画像を提供する理由のユースケースを紹介します。

私のアプリケーションの1つで、ユーザーはアバター画像をアップロードできます。これらの画像はアップロード時に処理され、名前がハッシュに変更され、ファイルシステムに保存されます。ハッシュされた名前は、写真のハッシュとユーザーIDを関連付け、これが選択されたプロフィール写真であるかどうかを示すテーブルのデータベースに保存されます。

Webサイトで単一の画像サイズのみを使用していた場合、画像パスと、それがプロファイル画像であるかどうかを保存し、それを使用していました。ただし、サイトには画像を表示できる場所が複数あり、サイズもさまざまです。要求された画像のサイズに応じて、それに近いサイズが生成されているかどうかを確認します。ある場合は、jpegヘッダーを送信readfileし、画像の場所で使用して画像を提供します。そうでない場合は、最初にアップロードした画像を取得し、必要なサイズにサイズ変更してファイルシステムに保存し、提供します。

このように、誰かが画像をアップロードするたびに5つ以上の画像を作成するわけではありません。一部の画像サイズは要求されない場合があるため、画像はオンデマンドで生成され、CPU時間を分散し、ファイルシステムの使用量を削減します。

したがって、基本的に、これらが当てはまる場合は、PHP/CIを介してサービスを提供する必要はありません。

  • アクセスを制限しない
  • 動的なサイズ変更は必要ありません
  • ウェブルートの外に画像を保存しない

興味がある場合は、私の画像の1つへのリクエストは次のようになります。

http://domain.com/photos/view/3d643a9cecaf8ae849be7ab094579698/s-128/photo.jpg

内訳:

http://domain.com/[controller/view]/[image hash]/[square, rectangular, or original]-[size in px]/photo.jpg

これにより、次のパスで画像が提供されます。

http://domain.com/images/uploads/3d/64/3a9cecaf8ae849be7ab094579698/3d643a9cecaf8ae849be7ab094579698_s_128.jpg

衝突が発生するように画像をサブディレクトリに保存し、ディレクトリあたりの最大ファイル数などによるファイルシステムの制限を回避します。また、画像をWebルートの外に移動して、Webに物理的にアクセスできないようにすることもできます。PHPを介して提供することには、アップロードディレクトリの場所を公開しないという追加の利点もあります。

答えが長かったことは知っていますが、それがあなたの決断に役立つことを願っています。

于 2012-10-04T23:04:59.417 に答える