Как мне создать уникальное имя файла для моего загрузчика изображений? - PullRequest
0 голосов
/ 04 апреля 2019

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

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

Вот моя форма - 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 .= "\n\n";

// 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 .= "\n\n";

// 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 .= "\n\n";

// 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'])){
}

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

Ответы [ 5 ]

1 голос
/ 04 апреля 2019

Создание имени файла с использованием хэша текущего имени файла и микротайма (метка времени 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'] ) );

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

0 голосов
/ 04 апреля 2019
  $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);
0 голосов
/ 04 апреля 2019

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

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

//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)
0 голосов
/ 04 апреля 2019

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

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

    $uuidV4 = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
        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...
0 голосов
/ 04 апреля 2019

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

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

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

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

...