Как мне создать уникальное имя файла для моего загрузчика изображений?

#php #html #file-upload #unique

#php #HTML #загрузка файла #уникальный

Вопрос:

У меня есть форма, в которой есть возможность загружать изображения.

Все работает нормально, однако мне нужно, чтобы загруженные изображения имели уникальное имя или номер до / после исходного имени файла, чтобы не перезаписывать другое изображение с таким же именем.

Вот моя форма —http://hoffwebsites.com/lfm_aow_form/application.php

Я пробовал использовать PHP-код в моем скрипте действий / рассылки, но у меня ничего не работает.

Вот мой код загрузчика файлов.

 <b>Please attach two or three digital photos of your work</b><br><br>
<i>Photo #1</i><br>
<input type='file' name='file_upload'><br><br>
<i>Photo #2</i><br>
<input type='file' name='file_upload2'><br><br>
<i>Photo #3</i><br>
<input type='file' name='file_upload3'><br><br>
  

Вот php-код действия / рассылки, который обрабатывает загрузку файлов и форматирует его в форме ответа по электронной почте, который пользователь получит после отправки.

 if ($_FILES["file_upload"]["name"] == "") {} else 
{ $message .= "Photo #1 n http://hoffwebsites.com/lfm_aow_form/uploaded_files/"; }


$message .= $_FILES["file_upload"]["name"]; 
$message .= "nn";

// Check filesize
if($_FILES['file_upload']['size'] > 2097152){
    die('<center><font size="3"><strong><u>Upload Error</u></strong></font>
<br>
<br>
<b>Your File Size is bigger then the maximum allowed - 2 MB.<br>
Please upload a smaller file.</b>
<br><br>
<a href="javascript: history.go(-1)">< Back</a>
<br></center>');
}


// Upload file
if(!move_uploaded_file($_FILES['file_upload']['tmp_name'], 'uploaded_files/' . $_FILES['file_upload']['name'])){
}

if ($_FILES["file_upload2"]["name"] == "") {} else 
{ $message .= "Photo #2 n http://hoffwebsites.com/lfm_aow_form/uploaded_files/"; }


$message .= $_FILES["file_upload2"]["name"]; 
$message .= "nn";

// Check filesize
if($_FILES['file_upload2']['size'] > 2097152){
    die('<center><font size="3"><strong><u>Upload Error</u></strong></font>
<br>
<br>
<b>Your File Size is bigger then the maximum allowed - 2 MB.<br>
Please upload a smaller file.</b>
<br><br>
<a href="javascript: history.go(-1)">< Back</a>
<br></center>');
}

// Upload file
if(!move_uploaded_file($_FILES['file_upload2']['tmp_name'], 'uploaded_files/' . $_FILES['file_upload2']['name'])){
}

if ($_FILES["file_upload3"]["name"] == "") {} else 
{ $message .= "Photo #3 n http://hoffwebsites.com/lfm_aow_form/uploaded_files/";  }


$message .= $_FILES["file_upload3"]["name"]; 
$message .= "nn";

// Check filesize
if($_FILES['file_upload3']['size'] > 2097152){
    die('<center><font size="3"><strong><u>Upload Error</u></strong></font>
<br>
<br>
<b>Your File Size is bigger then the maximum allowed - 2 MB.<br>
Please upload a smaller file.</b>
<br><br>
<a href="javascript: history.go(-1)">< Back</a>
<br></center>');
}

// Upload file
if(!move_uploaded_file($_FILES['file_upload3']['tmp_name'], 'uploaded_files/' . $_FILES['file_upload3']['name'])){
}
  

Пожалуйста, помогите сделать так, чтобы у этих загружаемых файлов было уникальное имя, чтобы не перезаписывать другой файл.

Ответ №1:

Создайте имя файла, используя хэш текущего имени файла и микротайм (временная метка unix с микросекундами), который никогда не повторяется.

Например

 $fileName = hash( 'sha512', $_FILES['file_upload2']['name'] . microtime() );
  

это вернет вам что-то вроде

a1758196cd3949485509be0d423d1ff85ada7857ab77cd77f6666107fce5b45dca01e42563f2925f136b677a7d169e100663c4eb705ccd742b8d3885d24ac005

Затем вы можете добавить расширение вашего файла обратно в конец, и это будет уникальное имя файла.

 $fileName = $_FILES['file_upload2']['name'];
$fileSplit = explode( '.', $fileName );
$fileName = hash( 'sha512', $fileName . microtime() ) . '.' . end( $fileSplit );
  

Вы просили меня предоставить вам пример использования вашего кода. Однако, если бы я это сделал, вы бы ничему не научились. Итак, вот что вам нужно сделать, чтобы это заработало.

Создайте функцию с предоставленным моим кодом. Назовите это чем-то вроде generateUniqueFileName()

 function generateUniqueFileName( $currentFileName = "" ){

}
  

Внутри этой функции поместите код, который создает хэш уникального имени файла

 function generateUniqueFileName( $currentFileName = "" ){
    //Explode the file name, so that we can get the file extension
    $fileSplit = explode( '.', $currentFileName );

    //Generate a unique name hash
    $fileName = hash( 'sha512', $currentFileName . microtime() ) . '.' . end( $fileSplit );

    //Return the unique file name hash
    return $fileName;
}
  

При вызове move_uploaded_file() функции замените второй параметр, чтобы использовать эту новую функцию для генерации нового имени файла. Я сделал первый для вас.

 move_uploaded_file($_FILES['file_upload']['tmp_name'], 'uploaded_files/' . generateUniqueFileName( $_FILES['file_upload']['name'] ) );
  

Удачи, если у вас есть какие-либо вопросы, пожалуйста, задавайте их в комментариях, и я сделаю все возможное, чтобы ответить.

Комментарии:

1. Возможно ли, что вы можете привести мне рабочий пример с предоставленным мной кодом? Я просто не уверен, как и где включить его в свой код. Спасибо.

2. @GinaDiSanto, я предоставил дополнительные инструкции о том, что вам нужно сделать, чтобы реализовать это. Если у вас есть какие-либо вопросы, пожалуйста, задавайте.

Ответ №2:

Вы могли бы добавить хэш к имени файла. Смотрите:https://www.php.net/manual/en/function.hash-file.php

Это будет хэшировать содержимое файла, предоставляя вам filename_<MYHASH>.ext

Это не гарантирует, что файл не будет перезаписан, поскольку два файла с одинаковым содержимым будут иметь одинаковое значение хэша.

Примечание: Хотя это редко, возможно, что два очень разных файла могут генерировать один и тот же хэш.

Ответ №3:

Чтобы создать уникальное имя файла для изображения, вам нужно сначала проверить, существует ли изображение в папке, прежде чем давать файлу имя.

вы можете использовать этот простой код

 //Define the document root
  //live server use this
  $sitedoc = $_SERVER['DOCUMENT_ROOT'];

  //localhost server use this     
  $sitedoc = $_SERVER['DOCUMENT_ROOT']."/name_of_your_project";

  $filename = $_FILES["file_upload"]["name"];  
  $doc = $sitedoc."/documents/".$filename; 

  if (file_exists($doc)) {
    $actual_name = pathinfo($filename,PATHINFO_FILENAME);       
    $extension = pathinfo($filename, PATHINFO_EXTENSION);
    //This is your new file name
    $filename = $actual_name.time().".".$extension;        
    //New image location
    $doc = $sitedoc."/documents/".$filename;           
   }
   //Do the upload here
   move_uploaded_file($_FILES["file"]["tmp_name"], $doc)
  

Ответ №4:

Таким образом, вы можете создать уникальное имя для загруженного вами файла, не беспокоясь о совпадении хэшей с разными файлами или именами, вероятность очень и очень мала, но это может произойти…

 function createFileUuid($fname) {
    $fnameParts = explode('.', $fname);

    $uuidV4 = sprintf('xx-x-x-x-xxx',
        mt_rand(0, 0xffff), mt_rand(0, 0xffff),
        mt_rand(0, 0xffff),
        mt_rand(0, 0x0fff) | 0x4000,
        mt_rand(0, 0x3fff) | 0x8000,
        mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
    );

    return $uuidV4 . '.' . end($fnameParts);
}

$fname = NULL;

do {
    $fname = createFileUuid($_FILES['file_upload']['name']);
} while (file_exists('uploaded_files/' . $fname));

// in this point $fname is unique...
  

Ответ №5:

   $extension=pathinfo($_FILES['file_upload']['name'],PATHINFO_EXTENSION);
  $file_name=$_FILES['file_upload']['name'].microtime();
  $unique_name=hash("md5",$file_name);
  move_uploaded_file($_FILES["file_upload"]["tmp_name"],
  "uploaded_files/" . $unique_name.".".$extension);