为上传的图片创建唯一名称

时间:2016-03-16 08:47:40

标签: php

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

代码看起来像这样

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


          move_uploaded_file($filename,  $imagePath . $_FILES["img"]["name"]);

现在发生的事情是,当我尝试使用move_uploaded_file移动图像时为图像提供唯一的名称,然后文件确实出现在文件夹内,但是它表示文件无效并且带有扩展名类型file。 我的代码尝试实现相同但上传图像的唯一名称/ ID。

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

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

3 个答案:

答案 0 :(得分:4)

示例代码:

// 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功能

CODE

// Get details of image
list($width, $height, $typeCode) = getimagesize($filename);
$imageType = ($typeCode == 1 ? "gif" : ($typeCode == 2 ? "jpeg" : ($typeCode == 3 ? "png" : FALSE)));

答案 1 :(得分:2)

$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";
    }
}

这里,location是目录内的文件夹,我主要创建文件夹“uploads” time()添加时间戳,它始终是唯一的,直到两个人同时上传,这很少见。

此外,为其添加4位数随机数,使组合最稀有

之后添加实际文件名,使组合成为唯一。

为什么我使用它:

  1. 如果您需要知道图片上传的时间,您可以提取时间戳。
  2. 你也可以提取实际文件名。
  3. 让我们说,我们如此独特的组合无论如何都会失败, 然后,无论生成随机数,php实例都会等待1到5秒。并使用最新的时间戳和重新生成的随机数重命名。

    这是你能想到的最好的,而不是资源匮乏。

答案 2 :(得分:1)

你可以使用

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