ユーザーがアップロードしたファイルをWebサーバーに保存する

私はユーザーがファイル(写真など)をアップロードできるWebサイトで作業しています。私はこの分野でこれまでの経験は全く持っておらず、これらのファイルを保存し索引を付けるための正しい方法で何らかのインプットを得ることを望んでいました。

大量のデータにうまく適応できるアーキテクチャを作りたいと思っていますが、現在は非常に高い(facebook-、google-scale)のボリュームは心配していません。

私は、ファイルシステムにファイルを格納することを考えていました。

/files/{username}/

そして、各ユーザが自分がアップロードした各ファイルのファイル名(とURL)を持つ自分のテーブルを持っているデータベース(と私が保存したいかもしれないその他の追加情報)をアップロードすること。 このデータベースの終わり(各ユーザに独自のテーブルを与える)は非常に非効率的ですが、1つのテーブル内のすべてのファイルの記録を維持することは正しいとは思わないだけでなく、1つのファイルが存在するたびにテーブル全体を検索する必要がありますアクセスされました。

各ユーザーに独自のテーブルを提供することを検討している私の考えは、テーブルをまたがってデータを断片化し、ユーザーに与えられたファイルを探すときの検索時間を短縮するきわめて明確な方法です。

7

2 答え

それはあなたのアプリとデータベースの性質と構造に依存します。私は、データベースベースのブロブに格納されたフォルダベースの画像、認証ゲートウェイ経由でアクセスされるウェブ外のファイルフォルダなど、多くのテクニックを使用してきました...

一時的な写真や何かのような、アプリやデータベースに直接関係しない外部の画像の場合、それらをフォルダに入れる傾向があります。あなたの構造がユーザーからの写真であるように思われるので、タグなど、画像に関連付けられたメタデータがあると思います。その場合、私はおそらくデータベーステーブルに画像を保存します。写真を保護する必要があり、認証なしで他のユーザーがアクセスできない場合、データベースには独自のセキュリティがありますが、ファイルベースのストレージには不正なアクセスを防ぐために何らかのトリックが必要です。

私はユーザーごとにテーブルを使用せず、ID、userid、picture blobの要素を持つピクチャのテーブルだけを使用します。

それは役に立ちますか?

3
追加された
それは助けになる。しかし、いくつかの問題があります。現時点では、1つのデータベースにつき1GBの容量しか持たない共有Webサーバーを使用しているため、画像/ファイルをデータベース自体に格納することは実現できません。また、特定の画像の検索時間を1つのテーブル内のすべての画像で増やすことはできませんか?ユーザーあたりのテーブルの背後にある私の推論は、ユーザーを知っているので、検索するテーブルを知っていて、より少ないレコードで検索する必要があるということでした(ユーザーIDに基づいてシャーディングと考える)。それは意味をなさないでしょうか?私は行方不明のものがありますか?
追加された 著者 xbonez,
インデックスのサイズはSQLの実行に影響しますが、インデックスされていない大きなブロブのセットは目立たないでしょう。しかし、それはあなたがスペースを持っていなければ、疑問な点です。その場合、それらをファイルシステムに格納する必要があります。 1つのフォルダ内の大きなファイル数を避けるのが良い方法であるため、たくさんある場合はuserid/photosフォルダ構造は問題ありません。私は直接アクセス(あなたがそれらにアクセスするために認証が必要であると仮定)を避けるために.htaccessを配置し、写真を使用するか?id =イメージ/ jpegなどにヘッダーを変更し、readfileのイメージをエコーし​​ます。
追加された 著者 Matt H,

どの Matt H が提案したのは、あなたはユーザーレベルの画像アクセスを達成しようとしています。しかし、あなたのデータベース格納スペースが限られていることを認め、バイナリデータにイメージを保存することは、あなたが述べたように非効率的です。

ユーザーあたりの表を使用するとデザインが悪いです。ファイルをアップロードしたユーザーは、すべてのファイルアップロードを格納するテーブル内のフィールド/列である必要があります。一意であることが保証されているファイル名のGUIDを生成することをお勧めします。ユーザーが単純にすべての画像にアクセスできないようにしようとしている場合、簡単に推測できる自動インクリメントフィールドよりも優れています。

あなたはパフォーマンスを懸念していますが、何百万ものレコードを処理するまでは、画像を選択するためのクエリはユーザーに属し、特定の時間枠内にアップロードされます(タイムスタンプなどを保存しています)。スピードが問題になる場合は、ユーザ名にBツリーインデックスを追加すると、ユーザ固有の画像クエリを大幅に高速化できます。

セキュリティ、アクセス、および組織のトピックに戻ります。ユーザーごとにフォルダに画像を保存します(ただし、ユーザー数にもよりますが、フォルダの数が管理不能なレベルに増加する可能性があります)。イメージを公開したくない場合は、Web以外のフォルダに保存し、アプリケーションでデータを読み込んでストリームして、そのイメージをユーザーに表示させます。より複雑ですが、実際のファイルをインターネットから隠すことができます。また、認証されたユーザーがイメージのすべての要求を検証できるようになります。

3
追加された