26

我正在尝试在上传图像时重命名图像的文件名(如果存在),例如我的文件名是否test.jpg存在并且它已经存在,我想将其重命名为test1.jpg然后test2.jpg等等。使用我编写的代码更改我的文件名test1.jpg,然后test12.jpg任何有关解决此问题的建议都将非常感谢!

PHP

$name = $_FILES['picture']['name'];
$actual_name = pathinfo($name,PATHINFO_FILENAME);
$extension = pathinfo($name, PATHINFO_EXTENSION);

$i = 1;
while(file_exists('tmp/'.$actual_name.".".$extension))
{           
    $actual_name = (string)$actual_name.$i;
    $name = $actual_name.".".$extension;
    $i++;
}
4

4 回答 4

47

这是我认为应该做的小修改:

$actual_name = pathinfo($name,PATHINFO_FILENAME);
$original_name = $actual_name;
$extension = pathinfo($name, PATHINFO_EXTENSION);

$i = 1;
while(file_exists('tmp/'.$actual_name.".".$extension))
{           
    $actual_name = (string)$original_name.$i;
    $name = $actual_name.".".$extension;
    $i++;
}
于 2013-04-21T21:47:38.613 回答
7

受@Jason 回答的启发,我创建了一个我认为更短且更易读的文件名格式的函数。

function newName($path, $filename) {
    $res = "$path/$filename";
    if (!file_exists($res)) return $res;
    $fnameNoExt = pathinfo($filename,PATHINFO_FILENAME);
    $ext = pathinfo($filename, PATHINFO_EXTENSION);

    $i = 1;
    while(file_exists("$path/$fnameNoExt ($i).$ext")) $i++;
    return "$path/$fnameNoExt ($i).$ext";
}

例子:

$name = "foo.bar";
$path = 'C:/Users/hp/Desktop/ikreports';
for ($i=1; $i<=10; $i++) {
  $newName = newName($path, $name);
  file_put_contents($newName, 'asdf');
}

新版本(2022):

function newName2($fullpath) {
  $path = dirname($fullpath);
  if (!file_exists($fullpath)) return $fullpath;
  $fnameNoExt = pathinfo($fullpath,PATHINFO_FILENAME);
  $ext = pathinfo($fullpath, PATHINFO_EXTENSION);

  $i = 1;
  while(file_exists("$path/$fnameNoExt ($i).$ext")) $i++;
  return "$path/$fnameNoExt ($i).$ext";
}

用法:

for ($i=1; $i<=10; $i++) {
  $newName = newName2($fullpath);
  file_put_contents($newName, 'asdf');
}
于 2017-04-11T09:43:26.067 回答
1

在上传到服务器之前,有几种方法可以在 PHP 中重命名图像。附加时间戳、唯一 ID、图像尺寸和随机数等。你可以在这里看到它们

首先,检查托管图像文件夹中是否存在图像文件名,否则上传。while 循环检查图像文件名是否存在并附加一个唯一的 id,如下所示...

function rename_appending_unique_id($source, $tempfile){

    $target_path ='uploads-unique-id/'.$source;
     while(file_exists($target_path)){
        $fileName = uniqid().'-'.$source;
        $target_path = ('uploads-unique-id/'.$fileName);
    }

    move_uploaded_file($tempfile, $target_path);

}

if(isset($_FILES['upload']['name'])){

    $sourcefile= $_FILES['upload']['name'];
    tempfile= $_FILES['upload']['tmp_name'];

    rename_appending_unique_id($sourcefile, $tempfile);

}

查看更多图片重命名策略

于 2016-12-11T04:03:48.703 回答
-1

我检查了 SO 并在这里找到了一个不错的 C# 答案,所以我将它移植到 PHP:

['extension' => $extension] = pathinfo($filePath);
$count = 0;
while (file_exists($filePath) === true) {
    if ($count === 0) {
        $filePath = str_replace($extension, '[' . ++$count . ']' . ".$extension", $filePath);
    } else {
        $filePath = str_replace("[$count].$extension", '[' . ++$count . ']' . ".$extension", $filePath);
    }
}
于 2022-01-18T15:07:35.253 回答