PHP Image Uploaded Name不会更改

时间:2017-11-15 12:47:19

标签: php

我有PHP函数来上传文件(图片)。

foreach($_FILES['wallpaperFile']['tmp_name'] as $key => $tmpName)
{
    $file_name = $_FILES['wallpaperFile']['name'][$key];
    $file_type = $_FILES['wallpaperFile']['type'][$key];
    $file_size = $_FILES['wallpaperFile']['size'][$key];
    $file_tmp  = $_FILES['wallpaperFile']['tmp_name'][$key];

    move_uploaded_file($file_tmp,"assets/img/wallpapers/".time().$file_name);
}

它正常工作,我可以看到我的文件夹上传的数据图片。

但是现在如何在没有time()

的情况下仅设置图像文件名.$file_name

如果我删除了.$file_name,那么即使我上传了3个文件,上传的文件也没有扩展名且只有1个文件是正确的。

示例:

  

图片文件名:1510750186shubuh.jpg

     

我只想要

     

1510750186.jpg

2 个答案:

答案 0 :(得分:2)

您可以使用pathinfo()PATHINFO_EXTENSION标记,赞:

foreach($_FILES['wallpaperFile']['tmp_name'] as $key => $tmpName)
{
    $file_name = $_FILES['wallpaperFile']['name'][$key];
    $file_type = $_FILES['wallpaperFile']['type'][$key];
    $file_size = $_FILES['wallpaperFile']['size'][$key];
    $file_tmp  = $_FILES['wallpaperFile']['tmp_name'][$key];
    $ext = pathinfo($file_name, PATHINFO_EXTENSION);

    move_uploaded_file($file_tmp,"assets/img/wallpapers/".time().'.'.$ext);
}

这只会添加扩展名而不是完整的文件名。

修改

要同时上传多个文件,请尝试使用其中的一个:

$newFileName = time()."{$key}.{$ext}";
move_uploaded_file($file_tmp,"assets/img/wallpapers/".$newFileName);

$newFileName = str_replace('.','',microtime(true)).".{$ext}";
move_uploaded_file($file_tmp,"assets/img/wallpapers/".$newFileName);

答案 1 :(得分:0)

我不认为文件的扩展名是你的问题。这是time()只有一秒钟的分辨率。 time()在该循环的任何迭代中具有不同的值是非常不可能的。因此,所有文件的名称都只有time()

最好使用具有微秒保真度或microtime(true)的{​​{1}}之类的内容,以便在同一请求中获得更高的分辨率。

uniqid()

您只需在该循环中打印foreach($_FILES['wallpaperFile']['tmp_name'] as $key => $tmpName) { $file_name = $_FILES['wallpaperFile']['name'][$key]; $file_type = $_FILES['wallpaperFile']['type'][$key]; $file_size = $_FILES['wallpaperFile']['size'][$key]; $file_tmp = $_FILES['wallpaperFile']['tmp_name'][$key]; /* user either this */ move_uploaded_file($file_tmp,"assets/img/wallpapers/" . microtime(true)); /* or this */ move_uploaded_file($file_tmp,"assets/img/wallpapers/" . uniqid()); } time()的值即可看出差异,以实现microtime(true)对您的要求造成的问题。

time()
  

警告

     

你应该在foreach($_FILES['wallpaperFile']['tmp_name'] as $key => $tmpName) { echo "time(): ", time(), "<br>\n"; echo "microtime(true): ", microtime(true), "<br>\n"; echo "uniqid(): ", uniqid(), "<br>\n"; } 永远不要依赖,因为它是用户提供的输入,因此很容易受到操纵。避免允许客户端通过通过此向量直接访问文件系统来利用/操纵您的文件系统。在您的文件系统上拥有一个完全随机的文件名,并将该随机名称存储在数据库中以将其与某些任意用户提供的输入相关联是可取的,因为它允许您保留对服务器文件系统的完全控制权,同时仍然允许用户保持对自己数据的控制。