千画像、いつ、どのように整理し、ディレクトリ構造ですか?(linux)

StackOverflow https://stackoverflow.com/questions/900512

  •  23-08-2019
  •  | 
  •  

質問

を取得しています何千人もの写真アップロードした数千人のユーザーに自分のLinuxサーバーが主催する1and1.com (思いCentOS、amの美しく雄大なぢ大自然に包のバージョン)。これは言語agnostic質問した参考までに、私が使っていクリアしました。

私が最初に考えただけでダンプすべて同じディレクトリにしたのを覚えている少し前に制限がありましたがどのように多くのファイルやディレクトリ下にディレクトリです。

次に私が考えたパターンを可能にするファイル内のディレクトリに基づくユーザーのメールアドレスとかを使用しているユーザー名とにかく)なものにならないようにしたいの制限はディレクトリのディレクトリに....

とにかく画像からuser@domain.com私も一緒に戦ってくれるかなということ:

/images/domain.com/user/images...

このスマートなう場合は何千人ものユーザーが言いたいことは、"gmail'かかってでも、より深く、このような

/images/domain.com/[first letter of user name]/user/images...

そのためにmike@gmail.com この...

/images/domain.com/m/mike/images...

この悪いアプローチを考えていますか。何がみなさんはどうですか。ならないようにしたいと問題も多くのディレクトリにも---


関連:

役に立ちましたか?

解決

私は次のように処理されます:

  1. かMD5ハッシュのイメージそのままでアウトソースしましょう。
  2. 書きるのMD5ハッシュのデータベースで身体の安全を確保するためれます。
  3. 保存しているディレクトリ構造を使用する最初のカップルのバイトのMD5ハッシュ六角文字列として、dirの名前です。ここでは、ハッシュは"abcdef1234567890'だ店として'a/b/abcdef1234567890'.

使用のハッシュもでき合併し、同じ画像をアップいます。

他のヒント

膨ジョー Bedaのアプローチ:

  • データベース
  • データベース
  • データベース

まつグループ化やファイルをユーザー独自のファイル名、アップロード日、写真でも"ケられ"は発生しません月日(EXIFすることができます。 このメタデータをデータベースの適切なクエリを取り出すには適切なファイルです。

利用のデータベースの主キーかどうかのファイルのハッシュ、またはautoincrementing数—検索ファイルの中で、固定のディレクトリ(または、固定の最大数のファイルN当たりディレクトリに記入された場合にまで行き、次の一例の k番目の写真に格納されるべきで {somepath}/aaaaaa/bbbb.jpg がaaaaaa=階(k/N)、フォーマットとして小数点または六角レンチ、bbbb=mod(k,N)に追加し、小数点または六角とします。この平ングを使う {somepath}/aa/bb/cc/dd/ee.jpg)

たらないようにしてくださいディレクトリ構造を直接にすることができます。れば、webブラウザによるアクセスを介してサーバのHTTP、urlのようにwww.myserver.com/images/{primary key}およびエンコードの適切なfiletypeのContent-Typeヘッダを表します。

ここで私は、まさにこのような状況のためにしばらく前に書いた二つの機能があります。彼らは、ファイルの多くを持っているそれぞれのメンバーの何千もサイト上で一年以上にわたって使用されてきました。

本質的には、アイデアは皆のためのユニークなディレクトリに、ディレクトリ構造を計算するために、各メンバーの一意のデータベースIDの最後の桁を使用することです。最初ではなく、最後の桁を使用して、より均一ディレクトリの広がりを保証します。各メンバーのための別のディレクトリには、保守作業がずっと簡単であることを意味、プラスの人々のものは(視覚のように)ここで、あなたは見ることができます。

// checks for member-directories & creates them if required
function member_dirs($user_id) {

    $user_id = sanitize_var($user_id);

    $last_pos = strlen($user_id);
    $dir_1_pos = $last_pos - 1;
    $dir_2_pos = $last_pos - 2;
    $dir_3_pos = $last_pos - 3;

    $dir_1 = substr($user_id, $dir_1_pos, $last_pos);
    $dir_2 = substr($user_id, $dir_2_pos, $last_pos);
    $dir_3 = substr($user_id, $dir_3_pos, $last_pos);

    $user_dir[0] = $GLOBALS['site_path'] . "files/members/" . $dir_1 . "/";
    $user_dir[1] = $user_dir[0] . $dir_2 . "/";
    $user_dir[2] = $user_dir[1] . $dir_3 . "/";
    $user_dir[3] = $user_dir[2] . $user_id . "/";
    $user_dir[4] = $user_dir[3] . "sml/";
    $user_dir[5] = $user_dir[3] . "lrg/";

    foreach ($user_dir as $this_dir) {
        if (!is_dir($this_dir)) { // directory doesn't exist
            if (!mkdir($this_dir, 0777)) { // attempt to make it with read, write, execute permissions
                return false; // bug out if it can't be created
            }
        }
    }

    // if we've got to here all directories exist or have been created so all good
    return true;

}

// accompanying function to above
function make_path_from_id($user_id) {

    $user_id = sanitize_var($user_id);

    $last_pos = strlen($user_id);
    $dir_1_pos = $last_pos - 1;
    $dir_2_pos = $last_pos - 2;
    $dir_3_pos = $last_pos - 3;

    $dir_1 = substr($user_id, $dir_1_pos, $last_pos);
    $dir_2 = substr($user_id, $dir_2_pos, $last_pos);
    $dir_3 = substr($user_id, $dir_3_pos, $last_pos);

    $user_path = "files/members/" . $dir_1 . "/" . $dir_2 . "/" . $dir_3 . "/" . $user_id . "/";
    return $user_path;

}

sanitize_var()が入力をスクラブ&それは数値だ確保するための支持機能である、$ GLOBALS [「site_path」]は、サーバの絶対パスです。うまくいけば、彼らはそれ以外の場合は自明でしょう。

私は別の要件のために使用されるが、あなたのニーズに合うことができたことは、単純な規則を使用することです。

1ずつ増加し、新しい番号の長さを取得し、この番号を付けます。

「」最後のIDと設定されているVARであると仮定します。

a = 564;
++a;
prefix = length(a);
id = prefix + a; // 3565

次に、あなたはこの規則を使用して、ディレクトリのタイムスタンプを使用することができます:

20092305 (yyyymmdd)

次に、あなたは、このようにあなたの道を爆発することができます:

2009/23/05/3565.jpg

(以上)

あなたは同じ時間(時には便利)で日付別、および数でソート順序を保つことができるので、

これは面白いです そして、あなたはまだ複数のディレクトリにパスを分解することができます。

ジョー Bedaの回答がほぼ完璧ますのでご了承願いますのMD5持することが明らかとなりcollidableにiirc2時間ノートパソコン?

とはいえ、ご使用のファイルのMD5ハッシュに記載の方法は、サービスとなり脆弱であります。どのように、攻撃の音も聞こえてきます。

  1. 便利なように、特定の写真
  2. そこで平MD5を使用していること(MD5画像+secret_stringで怖か)
  3. によって、魔法の衝突の写真(想像力)のハッシュとのないように
  4. たんの写真のように言うのが通常
  5. サービスで上書きし、新しい表示も

誰かが言うのです:けにはいきませんで保存しようとすると、上書きました。その場合はを予測することはできる人間をアップロードも。e.人気の写真をweb上でもアップ)は、この"ハッシュ場所"です。ユーザーに含まれるトレンドとアップロード時の写真キティ、その実際の表示として想像力を働かせます。い:利用SHA1ですることが明らかとなり領域を拡げ、iirc127年による10.000コンピュータクラスター?

が遅れるゲーム。そのソリューション(までご利用の場合)がファイル名のハッシュ.もうかっているところを簡単に再現可能ファイルパスをファイルの名前をもとづく分散ディレクトリ構造です。例えば、利用できるバイトのファイル名のハッシュコードでパス:

String fileName = "cat.gif";
int hash = fileName.hashCode();
int mask = 255;
int firstDir = hash & mask;
int secondDir = (hash >> 8) & mask;

この経路となっている"

/172/029/cat.gif

できるデータベース検索システム cat.gif ィレクトリ内のディレクトリ構造を再現することにより、アルゴリズムです。

利用の六角レンチのディレクトリ名と変換する int 設定値:

String path = new StringBuilder(File.separator)
        .append(String.format("%02x", firstDir))
        .append(File.separator)
        .append(String.format("%02x", secondDir)
        .toString();

より:

/AC/1D/cat.gif

私はこの数年前に移動します。これは、いくつかのより詳しい情報やサンプルコード: ファイル名のハッシュ:をハッシュされたディレクトリ構造.武器agiは、dexで下がらないboxerぐ!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top