PHP图片上传 - 重命名而不会丢失扩展名?

时间:2011-02-28 10:51:54

标签: php file

我目前有:

$file_name = $HTTP_POST_FILES['uid']['name'];
$random_digit=rand(0000,9999);
$new_file_name=$random_digit.$file_name;
$path= "uploads/images/users/".$new_file_name;
if($ufile !=none)
{
    if(copy($HTTP_POST_FILES['uid']['tmp_name'], $path))
    {
        echo "Successful<BR/>"; 
        echo "File Name :".$new_file_name."<BR/>"; 
        echo "File Size :".$HTTP_POST_FILES['uid']['size']."<BR/>"; 
        echo "File Type :".$HTTP_POST_FILES['uid']['type']."<BR/>"; 
    }
    else
    {
        echo "Error";
    }
}

这会在当前文件名之前生成一个随机数,即4593example.jpg 但我只想将整个文件名重写为4593.jpg删除不同的名称(例子)。当我尝试这样做时,我失去了扩展名(.jpg) 任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:4)

如果您只处理图像,我会考虑使用getimagesize()检测图像的类型,并根据该文件为新文件提供扩展名。

这样,您不必依赖于从用户那里获得的扩展(这可能是错误的)。

像这样:

$extensions = array(
  IMAGETYPE_JPG => "jpg",
  IMAGETYPE_GIF => "gif",
  IMAGETYPE_PNG => "png",
  IMAGETYPE_JPEG2000 => "jpg",
  /* ...... several more at http://php.net/manual/en/image.constants.php 
            I'm too lazy to type them up */

 );

$info = getimagesize($_FILES['uid']['tmp_name']); 
$type = $info[2];

$extension = $extensions[$type];

if (!$extension) die ("Unknown file type");

move_uploaded_file($_FILES['uid']['tmp_name'], $path.".".$extension);

` 也:

  • 正如@alex所说,您的方法存在相当大的随机名称冲突风险。您应该添加file_exists()检查以防止这些(例如,创建新的随机数的循环,直到找到一个不存在的循环)

  • HTTP_POST_FILES已弃用,请改用<{1}}

  • 我强烈建议您使用move_uploaded_file()代替易受攻击的$_FILES

答案 1 :(得分:3)

您可以使用以下代码获取原始扩展程序:

$extension = strrchr($HTTP_POST_FILES['uid']['tmp_name'], '.');

然后您可以将扩展名添加到变量$new_file_name,如下所示:

$new_file_name = $random_digit . $file_name . '.' . $extension;

答案 2 :(得分:3)

$ext = pathinfo($filename, PATHINFO_EXTENSION);

$newFilename = $random_digit . '.' . $ext;
顺便说一下,如果随机数发生冲突(可能发生在接下来或10年内)会发生什么?

有很多更好的方法来命名它们 - 例如,文件名的哈希值和time()理论上应该永远不会发生冲突(尽管实际上会发生哈希冲突)。

答案 3 :(得分:1)

您可以使用此代码:

$file_name = $HTTP_POST_FILES['uid']['name']; $random_digit=rand(0000,9999); 
$extension= end(explode(".", $HTTP_POST_FILES['uid']['name']));
$new_file_name=$random_digit.'.'.$extension; $path= "uploads/images/users/".$new_file_name; if($ufile !=none) { if(copy($HTTP_POST_FILES['uid']['tmp_name'], $path)) { echo "Successful
"; echo "File Name :".$new_file_name."
"; echo "File Size :".$HTTP_POST_FILES['uid']['size']."
"; echo "File Type :".$HTTP_POST_FILES['uid']['type']."
"; } else { echo "Error"; } }

享受!!!!!!!!!