如何为图片上传器创建唯一的文件名?

时间:2019-04-04 14:21:39

标签: php html file-upload unique

我有一个可以上传图片的表格。

一切正常,但是,我需要使上传的那些图像在原始文件名之前/之后具有唯一的名称或编号,以免覆盖另一个具有相同名称的图像。

这是我的表格-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 个答案:

答案 0 :(得分: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 :(得分:0)

您可以在文件名后附加一个哈希。参见:https://www.php.net/manual/en/function.hash-file.php

这将散列文件的内容,给您filename_<MYHASH>.ext

这不能确保文件不会被覆盖,因为具有相同内容的两个文件将具有相同的哈希值。

注意:尽管这种情况很少见,但两个完全不同的文件可能会生成相同的哈希值。

答案 2 :(得分:0)

通过这种方式,您可以为上传的文件创建一个唯一的名称,而不必担心哈希与不同的文件或名称匹配,这种可能性非常低,但是可能会发生...

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

答案 3 :(得分:0)

要为图像创建唯一的文件名,您需要先检查图像在该位置是否已经存在,然后再给文件命名。

您可以使用此简单代码

//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 :(得分:0)

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