2010-12-23 87 views
0

嗨,我想上傳服務器上的圖像,我已經做到了,但問題是,當我上傳圖像的相同名稱,它給了我錯誤,我想做什麼來追加一些東西到圖像的結尾名稱,以便每個圖像都有其自己的唯一 名稱。在php中更改圖像名稱

$TARGET_PATH =$TARGET_PATH . basename($_FILES['photo']['name']); 
if (file_exists($TARGET_PATH)) 
{ 
    // here will be the appended term 
}
+1

究竟是什麼問題? – 2010-12-23 10:22:52

回答

1

你應該這樣做:

$TARGET_PATH =$TARGET_PATH . basename($_FILES['photo']['name']); 
while (file_exists($TARGET_PATH)) 
{ 
    $TARGET_PATH =$TARGET_PATH . basename($_FILES['photo']['name'],'.jpg') . uniqid() . '.jpg'; 
} 

這樣,它總是會產生一個唯一的文件名。注意這將適用於擴展名爲jpg的文件。如果你想使用它的其他文件,那麼我會推薦這個:

$TARGET_PATH =$TARGET_PATH . basename($_FILES['photo']['name']); 
$ext = pathinfo($_FILES['photo']['name'], PATHINFO_EXTENSION); 

    while (file_exists($TARGET_PATH)) 
    { 
     $TARGET_PATH =$TARGET_PATH . basename($_FILES['photo']['name'],'.' .$ext) . uniqid() . '.'.$ext; 
    } 

提供擴展名爲basename將從名稱中刪除擴展名。 添加uniqid()會將一些獨特的熵添加到文件名的末尾。如果這對你來說太長了,你可以用rand(0,10)替換它;

此方法還具有隻有在發現文件確實存在時才執行的優點,否則將無法運行。

+0

感謝您的回覆,但請你解釋一下uniqid()和rand(0,10)的用法; rand方法只取0和10的限制......? – hunter 2010-12-23 10:38:55

+0

那麼這隻取決於你想要文件名的時間。 Uniqid()產生一個唯一的標識符並且會很長。 Rand(0,10)將產生一個介於0和10之間的數字。在這兩種方法之間,uniqid文件不存在的概率要高得多。 rand(0,10)可能會導致應用程序崩潰,導致堆棧溢出,因爲如果已經有10個文件名稱完全相同,則循環永遠不會結束。這真的歸結於你懷疑你的應用程序將被使用。您也可以用「time()」函數替換它。 – Jason 2010-12-26 02:14:44

0

想想返回唯一名稱的功能 - 樣(未經測試,是非常可改進):

<?php 
// ... 
function getUniqueFilename($targetPath = '.', $extension = 'jpg') { 
    $uniqueFilename = sha1(time() . mt_rand(1, 150)) . '.'. $extension; 

    if(file_exists($targetPath . $uniqueFilename)) { 
    getUniqueFilename($targetPath, $extension); 
    } else { 
    return $uniqueFilename; 
    } 
} 

// and you call it like 
$newFilename = getUniqueFilename('.', 'gif'); 
?> 

就像一個想法;-)

+0

是的,但是,這似乎相當cpu密集這樣一個簡單的任務,你不覺得嗎? – Jason 2010-12-23 10:28:23

3

你不應該得到的錯誤,當一個文件已經存在相同的名稱。 我認爲你的問題應該是別的。

但如果更改名稱只是解決您的問題也可以使用時間戳並將其添加到您的文件名是唯一的。

function uniqueName($filename){ 
    $f = explode('.', $filename); 
    $ext = $f[count($f)-1]; 
    return implode('.', $f).time().'.'.$ext; 
} 

此函數將適用於所有擴展。