2012-03-25 19 views
1

我敢肯定,這個問題已經被問的次數千元,所以在這裏不用我的版本...上傳圖像均勻成目錄結構

我有一個上傳圖像的形式... 每個圖像包含一個唯一的ID 。我用下面的函數來生成我UNID ID:

function generateUnid($key) { 
    $name = $_FILES[$key]['name']; //get image name from global variable $_FILES 
    $ext = pathinfo($name, PATHINFO_EXTENSION); //get image extension 
    $prefix = 'fc'; //prefix for unid 

    do { 
     $unid = uniqid($prefix, true); //generate a unid 
     $filename = $unid . '.' . $ext; //replace image name with unid 
     $path = PATH_UPLOAD_ARTWORK . $filename; // image path 
    } while (file_exists($path)); // check if the image name exists 

    return $filename; 
} 

返回值的樣品是:

fc4e7801523a04e6.06876802.jpg 

到目前爲止好。現在,我想爲我的圖像創建某種目錄結構。類似的東西,如:

0 
    0 
    1 
    2 
     fc4e7801523a04e6.06876802.jpg 
     ... 
    3 
    ... 
1 
    0 
    1 
    2 
    3 
    ... 
2 
    0 
    1 
    ... 

我大概可以得到我的唯一ID中的最後2個整數用於在正確的目錄立案的圖像。但是,我不確定這是否是正確的策略... 我如何確保圖像均勻地歸檔到文件夾中。我不想找回自我與包含12倍000的圖像,並用1 500幅圖像一個文件夾一個文件夾...

我在做它通過提取最後的2號我uniq的正確方法是什麼?是否有更好的方法均勻地歸檔圖像?

感謝

+0

我不知道你爲什麼要把文件放到這樣的任意桶?是否因爲您預計有大量文件,並希望避免在許多文件存儲在同一目錄中時有時會出現操作系統性能問題?爲什麼不根據日期或用戶名或類似的東西存儲?確切地說, – aaaidan 2012-03-25 06:36:09

+0

!我確實喜歡預先提前計劃。我已經看到這種方法在很多情況下使用。我喜歡這樣一個事實,即我可以拍攝非常大的照片,而且以後不會遇到性能問題。我可是隻有一個上傳圖片,我可以上傳一堆一天,沒有什麼天數或月...所以我不能使用商品名o約會... – Marco 2012-03-26 04:05:43

+1

那麼......你認爲你可能上傳在一天內有更多的文件比操作系統文件系統可以輕鬆處理的更多? – aaaidan 2012-03-27 02:45:03

回答

1

假設獨有的ID是均勻(僞)隨機的,我覺得是,這種策略將工作得很好,我認爲。由normal distribution預測,不可避免地會有幾個文件夾的數量比平均數多得多或少得多。

對圖像進行「合併」的一種稍好的方法是使用來自uid的許多數字的模(%),而不是使用最後兩位數字,以防萬一您選擇的數字具有某種模式。

我的建議是給它一個去看看它是如何爲你工作。理想情況下,您可以創建一個「測試工具」,它調用算法幾十萬次,之後您可以評估文件在目錄結構中的分佈是否適合您的目的。

+0

我使用你的建議並做了一些測試。令人驚訝的是,它做得很好!我上傳了150 000個文件,並且所有文件均勻地放入了文件夾 – Marco 2012-03-26 04:07:44

+0

Cool!並且文件數量最多的文件夾不是很多,你喜歡嗎?重要的是,你永遠無法100%確定一個文件夾最終不會獲得3000億個文件。 (您只能99.999999999999999%確定)。 當你計算每個文件夾中的文件的數量,你還不如上繪製直方圖中的數據!計算具有X文件的文件夾的數量並繪製它(X代表X軸,Y軸代表計數)。你應該得到一個以1500爲中心的合理的鐘形圖(如果150個文件有100個文件夾)。 – aaaidan 2012-03-27 02:52:41