2010-04-18 61 views

回答

3

uniqid()會起作用。

但是,您也可以使用md5()或sha1()來創建實際圖像的哈希值。如果有人上傳圖像兩次,這將減少多餘的文件。

+0

對於大型的圖像,這將是很慢。創建一個UUID的速度要快很多,即使是(相當多餘的)檢查衝突 – 2010-04-18 09:29:28

+1

真的,我不會推薦這個用於大型圖像,但我們可能在談論相當小的文件,通常用於網頁內容 – selfawaresoup 2010-04-18 09:31:05

+0

備註哈希算法沒有被設計爲生成唯一值 – Gumbo 2010-04-18 11:30:03

2

你必須接受你的文件名可能不會很短,但最好的做法是RFC 4122,並以最快的PHP實現的一個是這樣的:

// Execution (1000 IDs) took 7.509 milliseconds 
// Example uuid: f40bc6a1-3bce-4472-add8-bbbe500b7f72 
function mimec_uuid() 
{ 
    return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', 
     mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), 
     mt_rand(0, 0x0fff) | 0x4000, 
     mt_rand(0, 0x3fff) | 0x8000, 
     mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)); 
} 

個人雖然,我已經使用以下的(更快和更短)的算法,成功爲沒有需要擴展如Flickr項目:

// Execution (1000 IDs) took 5.097 milliseconds 
// Example uuid: 2c2e4067d1c92109660b8deecae1be08 
function xuuid() 
{ 
    return md5(microtime() . mt_rand(0, 0xffff)); 
} 
0

一個非常簡單的方法是使用一些獨特的用戶標識符和時間戳,

$imgName = md5($userEmail.microtime()); 
0

我讓圖像上傳與原始圖像的名稱,爲SEO的目的。如果我保持原始文件名不變,Google等會發現用戶的蝙蝠俠或艾菲爾鐵塔的圖像。所以我只需將mktime添加到前面,然後保存它。

$imagename = str_replace(' ','-',$imagename); 
$imagename = str_replace('_','-',$imagename); 
$target_path = $_SERVER['DOCUMENT_ROOT']."/uploads/".mktime()."-".$imagename; 
+0

壞主意,如果用戶提交的文件名是'../../ etc/passwd'或包含\ 0和東西... – Boldewyn 2010-04-20 19:02:52

0

32位MD5生成的圖像文件名有什麼問題?真的不太長。

如果像布萊恩,你打算讓他們使用自己的文件名,請確保你帶什麼不好的字符,例如:。 「」等爲安全起見