2013-03-20 16 views
6

Obecnie jestem w trakcie pisania aplikacji mobilnej za pomocą phonegapa. Jedną z niewielu funkcji, które chciałbym, aby ta aplikacja posiadała, jest możliwość przechwytywania obrazu i przesyłania go na zdalny serwer ...przesyłaj zdjęcia za pomocą php, używając unikalnych nazw plików

Aktualnie przechwytywanie i przesyłanie obrazu jest sprawne i działa poprawnie z kompilacją apk ... ale w moim php, obecnie nazywam obrazy "obraz [wstaw liczbę losową od 10 do 20] ... Problem w tym, że liczby można powtórzyć, a obrazy można nadpisać ... Mam przeczytaj i pomyśl tylko o użyciu rand() i wybraniu losowej liczby od 0 do getrandmax(), ale uważam, że mogę mieć takie same szanse na nadpisanie pliku ... Potrzebuję obrazu, który zostanie przesłany na serwer za pomocą niepowtarzalna nazwa za każdym razem, nie ważne co ... więc skrypt php sprawdzi, co serwer już posiada i napisz/prześlij obraz o unikalnej nazwie ...

wszelkie pomysły inne niż "rand()"?

Myślałem także o tym, żeby nazwać każdy obraz ... img + data + czas + losowe 5 znaków, które zawierałyby litery i cyfry ... więc jeśli zdjęcie zostało zrobione przy użyciu aplikacji o 4:37 rano na 20 marca 2013 r. Obraz będzie nazywał się "img_03-20-13_4-37am_e4r29.jpg" po przesłaniu na serwer ... Myślę, że to może działać ... (chyba że jest lepszy sposób), ale jestem sprawiedliwy nowy w PHP i nie rozumiem, jak napisać coś takiego ...

mój php jest następujący ...

print_r($_FILES); 
$new_image_name = "image".rand(10, 20).".jpg"; 
move_uploaded_file($_FILES["file"]["tmp_name"], "/home/virtual/domain.com/public_html/upload/".$new_image_name); 

Każda pomoc jest mile widziana ... Dzięki z góry! Ponadto, proszę dać mi znać, jeśli są jakieś dalsze informacje, które mogą być pominąć ...

+0

'$ new_image_name = "image" .microtime(). ". jpg"; 'powinno wystarczyć dla twoich potrzeb, JEŚLI 2 obrazy nie są przetwarzane dokładnie w tym samym czasie (ułamek sekundy). – Waygood

Odpowiedz

16

Można rozważyć uniqid() funkcję PHP. ten sposób kod, który zasugerował, by wyglądać następująco:

$new_image_name = 'image_' . date('Y-m-d-H-i-s') . '_' . uniqid() . '.jpg'; 
// do some checks to make sure the file you have is an image and if you can trust it 
move_uploaded_file($_FILES["file"]["tmp_name"], "/home/virtual/domain.com/public_html/upload/".$new_image_name); 

Należy także pamiętać, że losowe funkcje serwera, tak naprawdę nie są przypadkowe. Wypróbuj random.org, jeśli potrzebujesz czegoś rzeczywiście losowego. Losowe losowe losowe.

UPD: Aby korzystać z random.org z poziomu twojego kodu, będziesz musiał wykonać niektóre żądania API na swoich serwerach. Dokumentacja na ten temat jest dostępna tutaj: www.random.org/clients/http/.

Przykład połączenia będzie następujący: random.org/integers/?num=1&min=1&max=1000000000&col=1&base=10&format=plain&rnd=new. Zauważ, że możesz zmienić min, max i inne parametry, jak opisano w documentation.

W PHP można wykonać żądanie GET na serwerze zdalnym za pomocą funkcji file_get_contents(), biblioteki cURL, a nawet gniazd. Jeśli korzystasz z hostingu współdzielonego, połączenia wychodzące powinny być dostępne i włączone dla Twojego konta.

$random_int = file_get_contents('http://www.random.org/integers/?num=1&min=1&max=1000000000&col=1&base=10&format=plain&rnd=new'); 
var_dump($random_int); 
+0

+1 ładnie wykonane. "na podstawie bieżącego czasu w mikrosekundach" – Waygood

+0

wydaje się to działać naprawdę dobrze, ale jak mam zintegrować random.org? Zdecydowanie interesuje mnie prawdziwa losowość – JStormThaKid

1

Czy rozważałeś użycie md5_file? W ten sposób wszystkie twoje pliki będą miały unikalną nazwę i nie będziesz musiał się martwić o zduplikowane nazwy. Zwróć jednak uwagę, że spowoduje to zwrócenie tego samego ciągu znaków, jeśli zawartość jest taka sama.

Również tutaj jest inna metoda:

do { 
    $filename = DIR_UPLOAD_PATH . '/' . make_string(10) . '-' . make_string(10) . '-' . make_string(10) . '-' . make_string(10); 
} while(is_file($filename)); 

return $filename; 

/** 
* Make random string 
* 
* @param integer $length 
* @param string $allowed_chars 
* @return string 
*/ 
function make_string($length = 10, $allowed_chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890') { 
    $allowed_chars_len = strlen($allowed_chars); 

    if($allowed_chars_len == 1) { 
    return str_pad('', $length, $allowed_chars); 
    } else { 
    $result = ''; 

    while(strlen($result) < $length) { 
     $result .= substr($allowed_chars, rand(0, $allowed_chars_len), 1); 
    } // while 

    return $result; 
    } // if 
} // make_string 
+0

co, jeśli nazywa się to samo? md5_file ('image.jpg') === md5_file ('image.jpg') – Waygood

+0

A może pozbyłem się "obrazu"? zrób coś takiego jak print_r ($ _ FILES); $ new_image_name = md5(). ". Jpg"; move_uploaded_file ($ _ PLIKI ["plik"] ["tmp_name"], "/home/virtual/domain.com/public_html/upload/".$new_image_name); – JStormThaKid

+0

czy to zadziała? – JStormThaKid

-1

Funkcja stworzy niepowtarzalną nazwę przed przesłaniem obrazu.

// Upload file with unique name 
if (! function_exists('getUniqueFilename')) 
{ 
    function getUniqueFilename($file) 
    { 
     if(is_array($file) and $file['name'] != '') 
     { 
      // getting file extension 
      $fnarr   = explode(".", $file['name']); 
      $file_extension = strtolower($fnarr[count($fnarr)-1]); 

      // getting unique file name 
      $file_name = substr(md5($file['name'].time()), 5, 15).".".$file_extension; 
      return $file_name; 

     } // ends for is_array check 
     else 
     { 
      return ''; 

     } // else ends 

    } // ends 
} 
+0

Podobnie jak w przypadku innej odpowiedzi, random! = Unique. –

+0

Ponadto, dwa przesłane w tej samej sekundzie z pewnością spowodują problem. –

+0

FYI: ta odpowiedź została scalona z http://stackoverflow.com/questions/24255676/image-upload-with-diffrent-name – Shog9

5

Należy użyć tempnam() wygenerować unikalną nazwę pliku:

// $baseDirectory Defines where the uploaded file will go to 
// $prefix   The first part of your file name, e.g. "image" 
$destinationFileName = tempnam($baseDirectory, $prefix); 

Rozszerzenie nowego pliku należy zrobić po przeprowadzce przesłanego pliku, a mianowicie:

// Assuming $_FILES['file']['error'] == 0 (no errors) 
if (move_uploaded_file($_FILES['file']['tmp_name'], $destinationFileName)) { 
    // use extension from uploaded file 
    $fileExtension = '.' . pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); 
    // or fix the extension yourself 
    // $fileExtension = ".jpg"; 
    rename($destinationFileName, $destinationFileName . $fileExtension); 
} else { 
    // tempnam() created a new file, but moving the uploaded file failed 
    unlink($destinationFileName); // remove temporary file 
} 
+0

jej tworzenie plików .tmp – user3726268

+0

@ user3726268 Możesz później zmienić nazwę, aby zmienić rozszerzenie (lub całkowicie go usunąć). –

+0

@ user3726268 Btw, zrobienie 'tempnam()' jest jedynym podejściem, które zagwarantuje, że nowa nazwa pliku będzie unikalna (zamiast tylko losowa). –

Powiązane problemy