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