2013-03-20 27 views
6

Attualmente sto scrivendo un'app mobile con l'aiuto di PhoneGap. Una delle poche funzionalità che mi piacerebbe avere questa app è la possibilità di catturare un'immagine e caricarla su un server remoto ...caricare immagini tramite php utilizzando nomi di file univoci

Attualmente ho la porzione di acquisizione e caricamento/invio di immagini che funziona bene con una compilazione apk ... ma nel mio php, sto nominando l'immagine "immagine [inserisci un numero casuale da 10 a 20] ... Il problema qui è che i numeri possono essere ripetuti e le immagini possono essere sovrascritte ... Ho leggere e pensare solo usando rand() e selezionando un numero casuale da 0 a getrandmax(), ma sento che potrei avere la stessa possibilità di sovrascrittura di un file ... Ho bisogno che l'immagine venga caricata sul server con un nome unico ogni volta, non importa cosa ... quindi lo script php controllerebbe per vedere cosa ha già il server e scrive/carica l'immagine con un nome univoco ...

idee diverse da "rand()"?

Stavo anche pensando di nominare ogni immagine ... img + data + ora + casuale 5 caratteri, che includerebbe lettere e numeri ... quindi se un'immagine è stata scattata usando l'app alle 4:37 del mattino Il 20 marzo 2013 l'immagine sarebbe stata denominata "img_03-20-13_4-37am_e4r29.jpg" quando caricata sul server ... Penso che potrebbe funzionare ... (a meno che non ci sia un modo migliore) ma sono abbastanza nuovi a PHP e non avrebbe capito come scrivere una cosa del genere ...

il mio PHP è il seguente ...

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

Ogni aiuto è apprezzato ... Grazie in anticipo! Inoltre, per favore fatemi sapere se ci sono ulteriori informazioni che potrei tralasciare ...

+0

'$ new_image_name = "image" .microtime(). ". jpg"; 'dovrebbe essere sufficiente per le tue esigenze. Le immagini di IF 2 non vengono elaborate esattamente nello stesso momento (frazione di secondo). – Waygood

risposta

16

Si può prendere in considerazione la funzione del PHP uniqid(). In questo modo il codice è suggerito sarà simile alla seguente:

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

Anche tenere a mente che le funzioni casuali del server non sono realmente casuali. Prova a random.org se hai bisogno di qualcosa di veramente casuale. Casuale casuale casuale.

UPD: Per utilizzare random.org all'interno del codice, è necessario eseguire alcune richieste API ai propri server. La documentazione è disponibile qui: www.random.org/clients/http/.

L'esempio della chiamata potrebbe essere: random.org/integers/?num=1&min=1&max=1000000000&col=1&base=10&format=plain&rnd=new. Si noti che è possibile modificare min, max e gli altri parametri, come descritto nello documentation.

In PHP è possibile eseguire una richiesta GET su un server remoto utilizzando la funzione file_get_contents(), la libreria cURL o anche i socket. Se utilizzi un hosting condiviso, le connessioni in uscita dovrebbero essere disponibili e abilitate per il tuo account.

$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 ben fatto. "basato sul tempo corrente in microsecondi" – Waygood

+0

sembra funzionare molto bene, ma come dovrei integrare random.org? Sono decisamente interessato alla casualità vera – JStormThaKid

1

Avete considerato l'utilizzo di md5_file? In questo modo tutti i tuoi file avranno un nome univoco e non dovrai preoccuparti di nomi duplicati. Ma tieni presente che questo restituirà la stessa stringa se i contenuti sono gli stessi.

qui è anche un altro metodo:

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

e se fossero chiamati uguali? md5_file ('image.jpg') === md5_file ('image.jpg') – Waygood

+0

o forse mi sbarazzano di "immagine" tutti insieme? fare qualcosa come print_r ($ _ FILES); $ new_image_name = md5(). ". Jpg"; move_uploaded_file ($ _ FILES ["file"] ["tmp_name"], "/home/virtual/domain.com/public_html/upload/".$new_image_name); – JStormThaKid

+0

funzionerebbe? – JStormThaKid

-1

La funzione creerà un nome univoco prima di caricare l'immagine.

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

Come per l'altra risposta, random! = Unique. –

+0

Inoltre, due caricamenti nello stesso secondo causeranno sicuramente un problema. –

+0

FYI: questa risposta è stata unita da http://stackoverflow.com/questions/24255676/image-upload-with-diffrent-name – Shog9

5

Si dovrebbe usare tempnam() per generare un nome di file univoco:

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

L'estensione del vostro nuovo file dovrebbe essere fatto dopo aver spostato il file caricato, vale a dire:

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

sua creazione di file .tmp – user3726268

+0

@ user3726268 È possibile eseguire una rinomina in seguito per modificare l'estensione (o rimuoverlo completamente). –

+0

@ user3726268 Btw, facendo 'tempnam()' è l'unico approccio che garantirà che il nuovo nome del file sarà unico (invece che casuale). –

Problemi correlati