php根据csv值从url保存的图像重命名

问题描述:

当前:我的代码保存了csv文件中给出的URL的图像。php根据csv值从url保存的图像重命名

目标:重命名根据在同一csv文件的值保存的图像,并通过格式:CSV位置3,4,5,6,7,8
(例如100A1_https://www.instagram.com /p/BBzUXUFLrGH/_48.8486557_2.3481125)。

我想将this stackoverflow示例合并到我的代码中。但无法如我所希望的那样迷路。

<?php 
 

 
$destination = 'images/'; 
 
$dom = new DOMDocument; 
 

 
$dir = "dir to photos"; 
 

 
$row = 0; 
 

 
if (($handle = fopen("data/testcsvfile.csv", "r")) !== FALSE) { 
 
    while (($data = fgetcsv($handle, 100, ",")) !== FALSE /*&& $row < 1*/) { 
 
    $row++; 
 

 
    // number of fields in each row 
 
    $num = count($data); 
 

 
    // get url from position in csv 
 
    $url = $data[6]; 
 
    echo $row . " " . $url. PHP_EOL; 
 

 
    if(strlen($url) > 0){ 
 
     // if we have a url, get the contents 
 
     $page = file_get_contents($url); 
 
     //echo $page; 
 

 
     $dom->loadHTML($page); 
 

 
     // find url using meta tag 
 
     $my_tags = $dom->getElementsByTagName('meta'); 
 

 
     // find which one is the image and grab and save 
 
     foreach ($my_tags as $tag) { 
 
      if($tag->getAttribute("property") == "og:image"){ 
 
       $image_url = $tag->getAttribute('content'); 
 
       echo $image_url . PHP_EOL; 
 
       $the_image = file_get_contents($image_url); 
 

 
       // rename file based on csv 
 
       // $newname = "$dir"."$names[3] $names[4] $names[5]"."; 
 
       rename($newname); 
 

 

 
       file_put_contents($destination . "img_" . $row . ".jpg", $the_image); 
 

 
      } 
 

 
     } 
 

 
    } 
 

 
    } 
 
    fclose($handle); 
 
} 
 

 
?>
// test csv file 
 

 
Mon,1,0,100,A,1,https://www.instagram.com/p/BBzUXUFLrGH/,48.8486557,2.3481125 
 
Mon,1,0,100,A,1,https://www.instagram.com/p/BAe0tGULrC1/,48.85272468,2.347259349 
 
Mon,1,0,100,A,1,https://www.instagram.com/p/_zik5YLrMf/,48.85356691,2.345645975

+0

我不知道我的理解正确:你想将文件从'的https牵强重命名:// www.instagram.com/p/BBzUXUFLrGH /''到100A1_https:// www.instagram.com/p/BBzUXUFLrGH/_48.8486557_2.3481125'? –

+0

。图像目前正在通过随机计算机生成的与csv无关的命名约定(例如img_1)进行保存。 – eho

首先你要明白,使用URL作为文件名是一个很奇怪的/糟糕的事情。 一个URL使用特殊字符如'/',这些字符在某些操作系统中是目录分隔符。 如果你真的需要做到这一点,你需要先逃跑到文件名中的字符(或更好地与像下划线非特殊字符替换它们):

$newname = str_replace('/', '\/', $newname); 

脚本的一个更新版本的安全替代用下划线斜线:

<?php 

$destination = 'images'; 
$dom = new DOMDocument; 

if (($handle = fopen("data/testcsvfile.csv", "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 100, ",")) !== FALSE) { 
    $num = count($data); 

    // get url from position in csv 
    $url = $data[6]; 
    echo $row . " " . $url. PHP_EOL; 

    if(strlen($url) > 0){ 
     // if we have a url, get the contents 
     $page = file_get_contents($url); 
     //echo $page; 

     $dom->loadHTML($page); 

     // find url using meta tag 
     $my_tags = $dom->getElementsByTagName('meta'); 

     // find which one is the image and grab and save 
     foreach ($my_tags as $tag) { 
      if($tag->getAttribute("property") == "og:image"){ 
       $image_url = $tag->getAttribute('content'); 
       echo $image_url . PHP_EOL; 
       $the_image = file_get_contents($image_url); 

       $destinationName = str_replace('/', '_', sprintf(
        "%s%s%s_%s_%s_%s", 
        $data[3], 
        $data[4], 
        $data[5], 
        $data[6], 
        $data[7], 
        $data[8] 
       )); 

       $destinationPath = sprintf(
        "%s/%s", 
        $destination, 
        $destinationName 
       ); 


       file_put_contents($destinationPath, $the_image); 

      } 

     } 

    } 

    } 
    fclose($handle); 
} 

?> 
+0

很酷,谢谢!最终,我必须在地图上绘制这些图像,并让每个图像对应其各自的超链接。我不确定最好的方式去做。我想我可以放弃超链接并以不同的方式重新关联它。 – eho

+0

我用功能代码更新了答案。如果你不能使用数据库(但是在这种情况下考虑sqlite),你可以使用其他字符替换斜杠,然后用原始斜杠重新获得原始URL,以获得原始URL –

+0

哇,这太棒了。非常感谢!我会看看sqlite。再次感谢! – eho