Php 为上载的图像创建唯一的名称

Php 为上载的图像创建唯一的名称,php,Php,我有一个特定的图像上传代码。我在互联网上找到了这个,也没有对代码进行解释。从代码中我可以理解的是,php上传某个文件使其成为临时文件,然后将临时文件移动到原始位置 代码看起来像这样 $filename = $_FILES["img"]["tmp_name"]; list($width, $height) = getimagesize( $filename ); move_uploaded_file($filename, $imagePath . $

我有一个特定的图像上传代码。我在互联网上找到了这个,也没有对代码进行解释。从代码中我可以理解的是,php上传某个文件使其成为临时文件,然后将临时文件移动到原始位置

代码看起来像这样

 $filename = $_FILES["img"]["tmp_name"];
          list($width, $height) = getimagesize( $filename );


          move_uploaded_file($filename,  $imagePath . $_FILES["img"]["name"]);
现在发生的情况是,当我尝试在使用
move\u uploaded\u file
移动图像时为图像提供唯一名称时,文件夹中确实出现了一个文件,但它表示一个无效文件,扩展名类型为
file
。 我的代码用于尝试实现相同的目标,但上载的图像具有唯一的名称/id

$uniquesavename=time().uniqid(rand());
$filename = $_FILES["img"]["tmp_name"];
      list($width, $height) = getimagesize( $filename );
      move_uploaded_file($filename,  $imagePath . $uniquesavename);

如何实现与以前相同的功能,请您也解释一下前面的代码好吗?

示例代码:

// Get file path from post data by using $_FILES
$filename = $_FILES["img"]["tmp_name"];
// Make sure that it's a valid image which can get width and height
list($width, $height) = getimagesize( $filename );
// Call php function move_uploaded_file to move uploaded file
move_uploaded_file($filename,  $imagePath . $_FILES["img"]["name"]);
请试试这个:

// Make sure this imagePath is end with slash
$imagePath = '/root/path/to/image/folder/';
$uniquesavename=time().uniqid(rand());
$destFile = $imagePath . $uniquesavename . '.jpg';
$filename = $_FILES["img"]["tmp_name"];
list($width, $height) = getimagesize( $filename );       
move_uploaded_file($filename,  $destFile);
编辑1: 要以两种方式获取图像类型:

  • 从上载文件名获取文件类型
  • 使用php函数如下
代码 在这里,位置是文件夹内的目录,我主要创建文件夹“上传” time()添加时间戳,这总是唯一的,直到两个人同时上传,这是很少见的

此外,在它上面加上4位随机数,使组合最为罕见

然后添加实际文件名,使组合唯一

我为什么使用它:

  • 若你们需要知道图片上传的时间,你们可以在以后提取时间戳
  • 你也可以提取实际的文件名
  • 比如说,我们如此独特的组合以某种方式失败了, 然后,php实例将等待1到5秒,不管生成什么随机数。并使用最新的时间戳和重新生成的随机数重命名

    这是你能想到的最好的方法,而不是成为资源霸主。

    你可以使用它

    $strtotime = strtotime("now");
    $filename = $strtotime.'_'.$_FILES['file']['name'];
    

    您需要为获取唯一名称添加扩展解决方案是将时间戳添加到name@Mihai谢谢。这很有效。你能解释一下代码吗?@stig js whaaaaaaaaaaaaaaat?@stig js没有
    time()
    也是这样做的?如果原始文件不是jpg怎么办?取而代之的是原始文件的扩展名。@Mihai yeah可以使用类似这样的方法获得扩展名:
    $temp=explode(“.”,$u FILES[“img”][“name”]);$extension=end($temp)
    @BobGao更新的答案不只是使用
    .jpg
    ,而是更一般的答案。我会认为它是正确的。这对其他操作会有帮助。如果你愿意,可以使用我的函数。@itzmukeshy7是的,你可以从这个链接看一看,uniqid返回一个唯一的标识符,我们附加时间戳,因此,生成两个相同ID的概率非常低。我们不确定您所说的
    ,因此生成两个相同ID的概率非常低
    两个ID可能是相同的;不,当这个方法在一个涉及大量用户的大型网站上使用时,可能会显示相同的名称,因为在某个时间许多用户可能正在上传图像,最终会使用相同的名称,因为时间戳是相同的。所以说时间戳总是唯一的,是错误的。哈哈,阅读整个代码,4位随机数,u可以增加到6或任何数字,然后一个else on失败,并带有新的时间戳
    
    $name = $_FILES['file']['name'];
    $tmp_name =  $_FILES['file']['tmp_name'];
    $location = "uploads/";
    $new_name = $location.time()."-".rand(1000, 9999)."-".$name;
    if (move_uploaded_file($tmp_name, $new_name)){
                echo "uploaded";
    }
    else{
        sleep(rand(1,5));
        $new_name = $location.time()."-".rand(1000, 9999)."-".$name;
        if (move_uploaded_file($tmp_name, $new_name)){
                echo "uploaded";
        }
        else{
                echo"failed, better luck next time";
        }
    }
    
    $strtotime = strtotime("now");
    $filename = $strtotime.'_'.$_FILES['file']['name'];