web-dev-qa-db-ja.com

ファイルシステムに画像を保存するのに最適な方法

ユーザーが画像をアップロードする必要があるアプリケーションの開発。アプリケーションでのファイルアップロードの経験はあまりないので、ユーザーがファイルシステムにアップロードした画像を保存するための最良の方法は何だと思います。

7
cobie

優れた基本的なスターター戦略は次のとおりです。

  • 「イメージ」というテーブルを作成します。自動インクリメントの主キーがあることを確認します(IDと呼びます)。
  • ユーザーが画像をアップロードするときに、ファイルの元の名前とファイル拡張子を含む行をそのテーブルに挿入します。おそらく、アップロードしたユーザー、日付/時刻なども追跡します。
  • そのクエリから最後の挿入IDを取得します。画像をファイルシステムの「your-image-path /(ID)。(ext)」に保存します。たとえば、「/ images/350.png」。
  • (推奨)IDを使用して画像をロードする単純なラッパースクリプトを作成することで、IDを画像への直接リンクとして使用できます(そのため、実際のファイル名が不明瞭になるか、画像をWebディレクトリの外部に保持することもできます)。たとえば、「image.php?id = 500」または「/ image/500」。このスクリプトでは、httpヘッダーのテーブルにある元のファイル名を使用して、ダウンロード時にクライアントに元の名前で保存されるようにすることができます。

強化の領域:

  • サムネイルのサポート。アップロード時にサムネイルを生成し、「。thumbnail.jpg」として保存します。 IDに基づいてサムネイルを取得するには、ラッパースクリプトを使用します。
  • ハッシュディレクトリ。 1000以上のイメージが予想される場合は、それらを複数のサブディレクトリに分割して、ファイルシステムが遅くならないようにする必要があります(これが発生する正確なポイントはOSおよびその他の要因によって異なります)。したがって、画像IDが6500の場合、「/ images/6/6500.png」に保存することができます。
  • セキュリティ。アップロードしたイメージが実際のイメージであることを確認してから、ディスクに保存してください。これは特に画像への直接アクセスを許可する場合に重要です-アップロードして実行できる.phpファイルを受け入れたくない場合。また、画像ディレクトリからのスクリプトの実行を防ぐことにより、Webサーバーの設定がそのようなことを防ぐように設定されていることを確認してください。
17
GrandmasterB

画像は単なるファイルなので、他のファイルを保存するのと同じように、そのまま保存できます。

ただし、少し変形したい場合があります。たとえば、最近のほとんどのデジタルカメラでは、非常に高解像度のファイルが生成されます。幅2000ピクセル。ほとんどのユーザーは、それらをより扱いやすいものに縮小する方法を知りませんし、そうしたとしても、時間がない(または気にしない)ので、人々が大きな画像をアップロードできるようにしたい場合があります。それらを縮小します。

また、画像をどのように扱いますか?それらをWebページに表示しますか? Webページで機能する特定の形式のみがあります。誰かがTIFF画像をアップロードした場合、それをJPEGまたはPNGに変換することができます。

最後に、圧縮を増やしたい場合があります。誰かがあなたに妥当な解像度の画像を送ったが、それらが11までのすべての「品質」オプションをオンにされた場合、それは依然として大きなファイルになります。圧縮してさらに小さくすると、ファイルが小さくなります。

最後の考慮事項:画像を操作する場合は、すべての画像を同じ形式にしたい場合があります。特定の解像度と圧縮レベルのJPEGなので、画像操作で処理できる形式は1つだけです。

6

ストレージ戦略は、ほとんどの場合、イメージストレージを必要とするサイトの概念設計と、予想されるユーザー数に準拠する必要があります。もっと情報が必要だと思います。 PhotobucketやFlickrのような、主に画像ホスティングサイトとして設計されたサイトを作成していますか?または、画像はメッセージへの添付ファイルなどの二次的な懸念事項ですか?何枚の画像を保存する必要があると思いますか?このシステムには何人のユーザーがいますか?

フラットファイルシステムよりも優れた同時実行性を提供するために、私が知っていて使用している2つの一般的な戦略にSQLデータベースが含まれています。 DB内の画像を表すテーブルがあります。そのテーブルには、イメージの実際のバイトデータを格納する "BLOB"(バイナリラージオブジェクト)列、または他の場所にあるフラットファイルシステムのイメージへのパスを保持する文字列のいずれかがあります。どちらの方法でも、画像に関するデータのスキャンは非常に並列化できます。ディスクへのイメージの保存はより簡単で、DBのサイズは小さくなりますが、ユーザー数が多い状況ではパフォーマンスが低下します。画像をDBデータとして保存するのはその逆です。

3
KeithS