2011-02-28 142 views
3

我目前有:PHP圖片上傳 - 重命名不丟失擴展名?

$file_name = $HTTP_POST_FILES['uid']['name']; 
$random_digit=rand(0000,9999); 
$new_file_name=$random_digit.$file_name; 
$path= "uploads/images/users/".$new_file_name; 
if($ufile !=none) 
{ 
    if(copy($HTTP_POST_FILES['uid']['tmp_name'], $path)) 
    { 
     echo "Successful<BR/>"; 
     echo "File Name :".$new_file_name."<BR/>"; 
     echo "File Size :".$HTTP_POST_FILES['uid']['size']."<BR/>"; 
     echo "File Type :".$HTTP_POST_FILES['uid']['type']."<BR/>"; 
    } 
    else 
    { 
     echo "Error"; 
    } 
} 

這產生一個隨機數當前文件名即4593example.jpg 之前,但我只是想它來重寫整個文件名4593.jpg去除ucrrent名稱(例如) 。當我嘗試這樣做時,我失去了擴展名(.jpg) 任何幫助表示讚賞。

+0

你的問題解決了嗎? – 2011-02-28 11:03:35

回答

3
$ext = pathinfo($filename, PATHINFO_EXTENSION); 

$newFilename = $random_digit . '.' . $ext; 

順便說一句,如果隨機數發生衝突(可能發生在下一個或10年),會發生什麼?

有很多更好的方法來命名它們 - 例如,文件名的散列和time()從理論上應該不會發生衝突(雖然在實踐中確實發生了散列衝突)。

3

你可以通過下面的代碼原分機:

$extension = strrchr($HTTP_POST_FILES['uid']['tmp_name'], '.');

然後,您可以添加附加變量$new_file_name這樣的:

$new_file_name = $random_digit . $file_name . '.' . $extension;

4

如果您只處理圖片,我會考慮使用getimagesize()來檢測圖片的類型,並根據該圖片爲新文件提供一個擴展名。

這樣,您不必依賴從用戶那裏得到什麼擴展(這可能是錯誤的)。

像這樣:

$extensions = array(
    IMAGETYPE_JPG => "jpg", 
    IMAGETYPE_GIF => "gif", 
    IMAGETYPE_PNG => "png", 
    IMAGETYPE_JPEG2000 => "jpg", 
    /* ...... several more at http://php.net/manual/en/image.constants.php 
      I'm too lazy to type them up */ 

); 

$info = getimagesize($_FILES['uid']['tmp_name']); 
$type = $info[2]; 

$extension = $extensions[$type]; 

if (!$extension) die ("Unknown file type"); 

move_uploaded_file($_FILES['uid']['tmp_name'], $path.".".$extension); 

` 另外:

  • 由於@alex說,你的方法有隨機的名字的衝突的一個相當大的風險。您應該添加file_exists()檢查,以防止

  • HTTP_POST_FILES已被棄用的(如循環,直到找到一個,創建一個新的隨機數尚不存在),用$_FILES代替

  • 我強烈建議您可以使用move_uploaded_file()而不是copy(),這很容易受到攻擊。

+0

+1絕對正確! – alex 2011-02-28 11:02:42

+0

使用'copy()'可以發生哪些攻擊?謝謝。 – alex 2011-02-28 11:55:26

+0

@alex有/是一個漏洞 - 引入了'move_uploaded_file()'來響應它。實際上,我在2000年曾闖入一位朋友的phpBB中,或者其他東西:)等等,我會檢查我是否可以找到鏈接。 – 2011-02-28 11:56:31

1

您可以使用此代碼:

$file_name = $HTTP_POST_FILES['uid']['name']; $random_digit=rand(0000,9999); 
$extension= end(explode(".", $HTTP_POST_FILES['uid']['name'])); 
$new_file_name=$random_digit.'.'.$extension; $path= "uploads/images/users/".$new_file_name; if($ufile !=none) { if(copy($HTTP_POST_FILES['uid']['tmp_name'], $path)) { echo "Successful 
"; echo "File Name :".$new_file_name." 
"; echo "File Size :".$HTTP_POST_FILES['uid']['size']." 
"; echo "File Type :".$HTTP_POST_FILES['uid']['type']." 
"; } else { echo "Error"; } } 

享受!!!!!!!!!