2013-09-29 17 views
7

W jaki sposób chciałbym utworzyć losowy ciąg tekstu do użycia z nazwami plików?generowanie losowego ciągu znaków w php dla nazwy pliku

Przesyłam zdjęcia i zmieniając ich nazwy po zakończeniu. Wszystkie zdjęcia będą przechowywane w jednym katalogu, więc ich nazwy plików muszą być unikatowe.

Czy istnieje standardowy sposób robienia tego?

Czy istnieje sposób sprawdzenia, czy nazwa pliku już istnieje przed próbą nadpisania?

To jest dla jednego środowiska użytkownika (mnie), aby pokazać moje osobiste zdjęcia na mojej stronie internetowej, ale chciałbym zautomatyzować go trochę. Nie muszę się martwić o dwóch użytkowników próbujących załadować i generować tę samą nazwę pliku w tym samym czasie, ale chcę sprawdzić, czy już istnieje.

Wiem, jak załadować plik i wiem, jak generować losowe ciągi znaków, ale chcę wiedzieć, czy istnieje standardowy sposób robienia tego.

+0

Próbował pan coś? Opublikuj, co zrobiłeś. – SKJ

+0

zobacz [to pytanie] (http://stackoverflow.com/questions/4356289/php-random-string-generator) – TheWolf

+0

Losowe! = Wyjątkowe. – David

Odpowiedz

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); 

Przykâadowa:

zsd16xzv3jsytnp87tk7ygv73k8zmr0ekh6ly7mxaeyeh46oe8

EDIT

Zrób to unikalna w katalogu, zmiany funkcjonowała tutaj:

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

Dziękuję, to jest dokładnie to, o co prosiłem. Zrobiłem to w przeszłości, ale nie byłem pewien, czy to wystarczająco "solidne". – Mike

+0

Dzięki, jeśli to działa, sprawdź moją odpowiedź! – Domecraft

+0

Próbowałem od razu, ale musiałem zostawić to kilka minut. Zrobione teraz. – Mike

1

nadzieję, że to, co szukasz: -

<?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

Właściwym sposobem, aby to zrobić jest użycie tempnam() funkcji PHP. Tworzy plik w określonym katalogu z gwarantowana unikalnej nazwy, więc nie trzeba się martwić o przypadkowości lub zastąpieniem istniejącego pliku:

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

jak mogę użyć twojego kodu w połączeniu z kodem Domecrafta? Chcę mieć dłuższe nazwy plików. – Mike

+3

Możesz użyć kodu @ Domecraft do wygenerowania losowego ciągu znaków, a następnie przekazać go jako drugi argument do 'tempnam()'. Zostanie on poprzedzony nazwą pliku. –

+0

To prawda, ale wprowadzasz problem za pomocą 'unlink()' ing it. Jeśli unikalne nazwy plików są wymagane dla bezpieczeństwa, może to nie być w porządku. – Douglas

Powiązane problemy