2016-05-16 7 views
0

現在:my codeは、csvファイルで指定されたURLの画像を保存します。csv値に基づいてURLから保存されたphpの名前変更イメージ

目標:同じ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

私は私が正しく理解していない:100A1_https 'に// www.instagram.com/P/BBzUXUFLrGH /'::あなたは、HTTPS 'からフェッチされたファイルの名前を変更しようとしている// www.instagram.com/p/BBzUXUFLrGH/_48.8486557_2.3481125'? –

+0

。 csvとは何の関係もないランダムなコンピュータ生成の命名規則(img_1など)によって画像が保存されています。 – eho

答えて

0

まず、ファイル名としてURLを使用すると、非常に奇妙な/悪いことであるということを理解する必要があります。 URLは、一部のOSではディレクトリ区切り文字である '/'のような特殊文字を使用します。 あなたは本当に(アンダースコアなどの非特殊文字に置き換えて良いか)あなたがファイル名にその文字をエスケープするために最初に必要なこれを行う必要がある場合:

$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

私は機能コードで答えを更新しました。 DBを使用することはできませんが(この場合はsqliteについて考える)、元のスラッシュを再スローして元のURLを得るために、スラッシュの維持を行うことができます。 –

+0

これは素晴らしい。どうもありがとうございます!私はsqliteを見ていきます。再度、感謝します! – eho

関連する問題