【问题标题】:Rename Images with php and database使用 php 和数据库重命名图像
【发布时间】:2020-04-27 08:19:49
【问题描述】:

对不起,我不知道如何给它起一个更好的名字,这是我在这里的第一个帖子。

我遇到的问题是...我有一堆文件名都采用这种语法的图像:

ABC_1234-sometext.jpg

只是在 php 中重命名它没什么大不了的,但我想要的是,我想要得到 ​​p>

1234

这对于每张图片都是唯一的(我们称之为 products_ean),并在我的数据库中执行 SELECT 查询,为每张同样唯一的图片返回不同的 ID poducts_id。

所以我想要的是得到

ABC_1234-sometext.jpg

进入

56789.jpg

其中数字与数据库相关。那有意义吗? 我希望有人能把我推向正确的方向。

这将是产生所需图像文件名的查询:

SELECT products_id FROM products WHERE products_ean = '.$img_name_strg.'

【问题讨论】:

  • 啊,好吧,抱歉。我并没有真正意识到这一点。但无论如何,我在这里给出一个 MCRE 是很棘手的。因为查询本身不是问题,所以我已经从可行的当前文件名中过滤了数字。重命名也应该很容易。这只是如何将不同部分缝合在一起的想法。读取文件名,获取部分名称并将其放入查询中,从而生成新 ID,然后重命名文件。所以我需要的是更多的外部结构。
  • 我不同意就够了。
  • 这些文件是否已经在您的服务器上,或者您希望在上传过程中这样做
  • @RiggsFolly 他可以在选择查询中进行更新查询吗?
  • 过滤功能可以帮助你如果你只想得到一个数字

标签: php mysql image rename


【解决方案1】:

您可以使用以下代码并将文件名修改为您想要的任何内容。

我使用 round(microtime(true)) 作为唯一名称,而不是数据库 ID。

$temp = explode(".", $file["name"]);
$filename = "filename"
$newfilename =$filename . '.' . end($temp);
move_uploaded_file($file["tmp_name"], $target_dir . $newfilename);

不要忘记检查您的文件是否已上传。

【讨论】:

  • 我认为您可能需要再仔细阅读一下这个问题:)
  • 非常感谢。那是一个开始,基本上我一直在寻找。我会尝试并发布我的结果以防万一。
【解决方案2】:

试试下面的代码。

$files = glob($dir.'/*'); //get all images
$i=1234;
    foreach($files as $file){
        if(is_file($file)){
            copy($file,'folder/'.$i'.jpg');//copy ABC_1234-sometext.jpg to 1234.jpg
            unlink($file); //delete ABC_1234-sometext.jpg
        }
    }

【讨论】:

    【解决方案3】:

    您可以创建一个查询来获取图像 clumn 并使用新的随机名称更改图像名称,而无需更改扩展。 或者将它们加载到页面上,然后用新名称和更新表重命名。 获取图像的第一部分使用:

    $file_name = $row['img'];
    $image = explode('.',$file_name);
    

    使用它来更改名称$image 然后包括他们的扩展

    $chagedImage =$image . '.' . end($temp);
    

    在你的 move_upload $chagedImage 中使用这个值

    UPDATE :
    

    我认为运行这个查询就可以了

    function generatenewstring($lenght){
    //This function creates random tokens for new name
            $token = 'qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJKLYXCVBNM0123456789';
            $token = str_shuffle($token);
            $token = substr($token, 0, 36);
            return $token;
    }
    $stmt = $pdo->prepare('SELECT * FROM your_table');
    $stmt->execute();
    $row = $stmt->fetchAll();
        $id = $row['id'];
    
        $image = explode('.',$row['img']);
        $extension = pathinfo($image, PATHINFO_EXTENSION);
    //$image this is your old image name
    
        $chagedImage = generatenewstring(20) . '.' . $extension);
    
    //$chagedImage this is your new image name
    
        $sql = "UPDATE your_table SET image = ? WHERE id = ?";
        $pdo->prepare($sql)->execute([$chagedImage, $id]);
    

    【讨论】:

      【解决方案4】:

      我现在想出了这个。有用。但我不确定如果我必须重命名一千张图片,这是否可行?我想在 foreach 中进行查询不是一个好方法吗?

      $dir = '/original_file_directory';
      $destination = '/destination_directory/';
      
      $files = glob($dir.'/*'); //get all images
      
      
      foreach($files as $file){
          if(is_file($file)){
      
              $ean = substr(basename($file), 8, 5);
      
              $image_query = xtc_db_query("SELECT products_id FROM products WHERE 
              products_manufacturers_model = ".$ean."");
              $image_id = xtc_db_fetch_array($image_query);
              $image_id = $image_id['products_id'];
      
      
      if($image_id != '')
             copy($file,$destination.$image_id.'.jpg');
          }
      }
      

      如果我有文件可以给我相同的 $ean 并且我必须为这些双打添加 ..._0.jpg 和 ..._1.jpg 怎么办?

      【讨论】:

      • 我刚试了一下,即使有大约 2000 张图像,它也能正常工作。这是我只“手动”使用的脚本。所以我想这没什么大不了的。
      • 我以不同的方式解决了双重问题。原始图像在其他位置有 001 或 002。这表明它是否是相同 ID 的另一个图像。所以我就拿这个来解决问题。
      猜你喜欢
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多