2013-09-29 82 views
7

如何創建隨文本名稱一起使用的文本字符串?在php中爲文件名生成隨機字符串

我上傳照片並在完成後重命名它們。所有照片將被存儲在一個目錄中,因此它們的文件名必須是唯一的。

有沒有這樣做的標準方式?

有沒有辦法在覆蓋之前檢查文件名是否已經存在?

這是一個單用戶環境(我)在我的網站上顯示我的個人照片,但我想稍微自動化一下。我不需要擔心兩個用戶同時嘗試上傳和生成相同的文件名,但我確實想檢查它是否已經存在。

我知道如何上傳文件,並且我知道如何生成隨機字符串,但是我想知道是否有標準的方法。

+0

你嘗試過什麼?請發佈你做了什麼。 – SKJ

+0

看到[這個問題](http://stackoverflow.com/questions/4356289/php-random-string-generator) – TheWolf

+0

隨機!=獨特。 – David

回答

21
function random_string($length) { 
    $key = ''; 
    $keys = array_merge(range(0, 9), range('a', 'z')); 

    for ($i = 0; $i < $length; $i++) { 
     $key .= $keys[array_rand($keys)]; 
    } 

    return $key; 
} 

echo random_string(50); 

輸出示例:

zsd16xzv3jsytnp87tk7ygv73k8zmr0ekh6ly7mxaeyeh46oe8

編輯

使目錄中的這種獨特的,變化在這裏發揮作用:

function random_filename($length, $directory = '', $extension = '') 
{ 
    // default to this files directory if empty... 
    $dir = !empty($directory) && is_dir($directory) ? $directory : dirname(__FILE__); 

    do { 
     $key = ''; 
     $keys = array_merge(range(0, 9), range('a', 'z')); 

     for ($i = 0; $i < $length; $i++) { 
      $key .= $keys[array_rand($keys)]; 
     } 
    } while (file_exists($dir . '/' . $key . (!empty($extension) ? '.' . $extension : ''))); 

    return $key . (!empty($extension) ? '.' . $extension : ''); 
} 

// Checks in the directory of where this file is located. 
echo random_filename(50); 

// Checks in a user-supplied directory... 
echo random_filename(50, '/ServerRoot/mysite/myfiles'); 

// Checks in current directory of php file, with zip extension... 
echo random_filename(50, '', 'zip'); 
+0

謝謝,這正是我所追求的。我在過去做過,但不確定這是否足夠「健壯」。 – Mike

+0

謝謝,如果它工作,請檢查我的答案! – Domecraft

+0

我試圖立刻離開,但我不得不離開它幾分鐘。現在完成了。 – Mike

1

希望這是什麼您正在尋找: -

<?php 
function generateFileName() 
{ 
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789_"; 
$name = ""; 
for($i=0; $i<12; $i++) 
$name.= $chars[rand(0,strlen($chars))]; 
return $name; 
} 
//get a random name of the file here 
$fileName = generateName(); 
//what we need to do is scan the directory for existence of the current filename 
$files = scandir(dirname(__FILE__).'/images');//assumed images are stored in images directory of the current directory 
$temp = $fileName.'.'.$_FILES['assumed']['type'];//add extension to randomly generated image name 
for($i = 0; $i<count($files); $i++) 
    if($temp==$files[$i] && !is_dir($files[$i])) 
    { 
    $fileName .= "_1.".$_FILES['assumed']['type']; 
    break; 
    } 
unset($temp); 
unset($files); 
//now you can upload an image in the directory with a random unique file name as you required 
move_uploaded_file($_FILES['assumed']['tmp_name'],"images/".$fileName); 
unset($fileName); 
?> 
27

正確的方式做,這是使用PHP的tempnam()功能。它會在指定的目錄與保證唯一名稱的文件,所以你不必擔心隨機性或覆蓋現有文件:

$filename = tempnam('/path/to/storage/directory', ''); 
unlink($filename); 
move_uploaded_file($_FILES['file']['tmp_name'], $filename); 
+0

我怎樣才能將您的代碼與Domecraft的代碼結合使用?我想要更長的文件名。 – Mike

+3

您可以使用@ Domecraft的代碼生成一個隨機字符串,然後將其作爲第二個參數傳遞給'tempnam()'。它會以文件名爲前綴。 –

+0

這是真的,但是你用'unlink()'來引入一個問題。如果安全性需要唯一的文件名,則可能不正確。 – Douglas