2016-05-16 5 views
0

derzeit: Mein Code speichert Bilder von URLs in einer CSV-Datei gegeben.php Umbenennen Bild gespeichert von URL basierend auf csv Werte

Ziel: gespeicherte Bilder umbenennen nach Werten in der gleichen CSV-Datei, und formatiert von: csv Positionen 3,4,5,6,7,8
(zB 100A1_https: //www.instagram.com /p/BBzuXUFLrGH/_48.8486557_2.3481125).

Ich versuche this stackoverflow Beispiel in meinen Code zu verschmelzen. aber unfähig zu, wie ich hoffnungslos verloren bin.

<?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

ich bin nicht sicher, ich richtig verstehe: versuchen Sie die Datei geholt von 'https umbenennen: // www.instagram.com/p/BBzUXUFLrGH /' auf '100A1_https: // www.instagram.com/p/BBzUXUFLrGH/_48.8486557_2.3481125''? –

+0

genau. Bilder werden derzeit durch eine zufällige computergenerierte Namenskonvention (z. B. img_1) gespeichert, die nichts mit dem csv zu tun hat. – eho

Antwort

0

Zuerst müssen Sie verstehen, dass eine URL als Dateinamen verwendet, ist eine sehr seltsame/schlechte Sache. Eine URL verwendet spezielle Zeichen wie '/', die in einigen Betriebssystemen als Verzeichnistrennzeichen verwendet werden. Wenn Sie das wirklich Sie zuerst das Zeichen im Dateinamen entkommen muß tun müssen, um (oder besser, sie mit nicht Sonderzeichen wie ein Unterstrich ersetzen):

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

Eine aktualisierte Version des Skriptes mit sicherer Substitution der schlitzt mit Unterstrichen:

<?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

cool, danke! Irgendwann muss ich diese Bilder auf einer Karte plotten und jedes Bild muss seinem jeweiligen Hyperlink entsprechen. Ich war nicht sicher, der beste Weg, um es zu tun. Ich schätze, ich kann auf den Hyperlink verzichten und ihn auf andere Weise neu verknüpfen. – eho

+0

Ich habe die Antwort mit einem funktionalen Code aktualisiert. Wenn Sie keine DB verwenden können (aber denken Sie an sqlite in diesem Fall), können Sie die Schrägstriche mit einem anderen Zeichen ersetzen, das Sie dann mit dem Original-Schrägstrich wiederherstellen, um die Ursprungs-URL zu erhalten. –

+0

wow, das ist erstaunlich . ich danke dir sehr! Ich werde sqlite anschauen. Danke noch einmal! – eho

Verwandte Themen