2013-05-08 45 views
0

如何爲圖像設置唯一名稱?我試圖使用tempnam(),但它始終將URL和文件保存爲.tpm。這裏是我的代碼:保存之前圖像的唯一名稱PHP

$file = $_FILES['file']; 

$name = $file['name']; 

$tname = tempnam("imagenes/", $name); 

$path = "imagenes/" . basename($tname); 
if (move_uploaded_file($file['tmp_name'], $path)) { 
    // Move succeed. 
} else { 
    // Move failed. Possible duplicate? 
} 

$sql = mysql_query("INSERT INTO `productos` (`img`) VALUES ('".$path."')"); 
// ... 

而且我怎麼檢查(安全),如果圖像已經真正貼?像mime類型或類似的東西。

UPDATE:

我剛修好使用

$tname = uniqid().$name; 
+2

使用'tempnam()'指定擴展名是不可能的。不幸的是,這是事實 – hek2mgl 2013-05-08 03:04:22

+0

所以,我怎樣才能設置一個獨特的名稱沒有。 – 2013-05-08 03:05:47

回答

1

要檢查是否有有效的圖像文件大小和,

$allowedExts = array("gif", "jpeg", "jpg", "png"); 
$extension = end(explode(".", $_FILES["file"]["name"])); 
if ((($_FILES["file"]["type"] == "image/gif") 
|| 
($_FILES["file"]["type"] == "image/jpeg") 
|| 
($_FILES["file"]["type"] == "image/jpg") 
|| 
($_FILES["file"]["type"] == "image/png")) 
&& 
($_FILES["file"]["size"] < 10485760)&& in_array($extension, $allowedExts))    { 

    //DO 
} 

對於獨特的圖像,我建議你將圖像存儲在新表中,並追加imade id作爲文件名!

+0

但有人告訴我這很容易「僞造」擴展名,所以這就是爲什麼我需要檢查「 mime類型「我認爲?」,這是真的嗎? SORRY I DIDNT看到類型部分 – 2013-05-08 03:15:21

+0

你知道我爲什麼得到..嚴格標準:只有變量應通過引用傳遞 – 2013-05-08 03:21:38

+1

@DreaminMediaQueretaro注意:雖然很容易假冒擴展名,但很容易將MIME類型僞造爲好。當涉及到安全檢查時,您不能依賴這些信息。只要將這些文件作爲* untrusted *數據處理即可 – hek2mgl 2013-05-08 03:21:39

1

這是不可能的指定使用tempnam()擴展唯一的名稱。不幸的是,這是事實。

儘管您所描述的問題聽起來像是一個容易解決的任務,但避免可能的競爭條件(不使用tempnam())存在問題。雖然它們不太可能出現,但可能性仍然存在。

如果您確定只有PHP在該目錄下工作,您可以實施基於flock()的機制以確保文件只能創建一次。

如果你沒有太在意的是可能的,但可能性非常小,競爭條件,我會建議你使用過這樣的事情:

$filename = 'images/' . uniqid() . '.jpg'; 
+0

是的,我只是看到你的答案,但是,搜索我發現了一個類似的問題解決使用uniqid()。 ,但是非常感謝你的解釋,我真的很喜歡學習WHY – 2013-05-08 03:16:35

+0

沒問題:) .. – hek2mgl 2013-05-08 03:18:54