2011-03-06 20 views
0

我想使用fopen,fwrite將文件從外部服務器保存到服務器上的文件夾中。使用fopen,在foreach循環中多次擦寫

首先從外部網站加載頁面,並掃描任何圖像鏈接。然後,該列表從一個fwrite函數發送。這些文件是創建的,但它們不是有效的jpg文件,在瀏覽器中查看它們,似乎它們在我的服務器上的路徑寫入了它們。

下面是代碼:

//read the file 
$data = file_get_contents("http://foo.html"); 

    //scan content for jpg links 
preg_match_all('/src=("[^"]*.jpg)/i', $data, $result); 

//save img function 
function save_image($inPath,$outPath) 
{ 
    $in= fopen($inPath, "rb"); 
    $out= fopen($outPath, "wb"); 
    while ($chunk = fread($in,8192)) 
    { 
     fwrite($out, $chunk, 8192); 
    } 
    fclose($in); 
    fclose($out); 
} 

//output each img link from array 
foreach ($result[1] as $imgurl) { 
    echo "$imgurl<br />\n"; 
    $imgn = (basename ($imgurl)); 
    echo "$imgn<br />\n"; 
    save_image($imgurl, $imgn); 
} 

的save_image功能的工作原理,如果我寫了一個清單:

save_image('http://foo.html', foo1.jpg); 
save_image('http://foo.html', foo1.jpg); 

我希望我能夠剛剛從循環列表在數組中匹配。

感謝您的期待。

回答

1

有兩個問題你的腳本。首先引號被包含在外部圖片網址中。爲了解決這個問題您正則表達式應該是:

/src="([^"]*.jpg)/i 

其次,圖像的URL可能不是絕對的(不包含http://和文件路徑)。把這個在你的foreach開始修復:

$url = 'http://foo.html'; 
# If the image is absolute. 
if(substr($imgurl, 0, 7) == 'http://' || substr($imgurl, 0, 8) == 'https://') 
{ 
    $url = ''; 
} 
# If the image URL starts with /, it goes from the website's root. 
elseif(substr($imgurl, 0, 1) == '/') 
{ 
    # Repeat until only http:// and the domain remain. 
    while(substr_count($url, '/') != 2) 
    { 
    $url = dirname($url); 
    } 
} 
# If only http:// and a domain without a trailing slash. 
elseif(substr_count($imgurl, '/') == 2) 
{ 
    $url .= '/'; 
} 
# If the web page has an extension, find the directory name. 
elseif(strrpos($url, '.') > strrpos($url, '/')) 
{ 
    $url = dirname($url); 
} 
$imgurl = $url. $imgurl; 
+0

非常感謝你,這個工程。 :) – Nooga 2011-03-07 00:17:03

0

fopen不保證能夠正常工作。你應該檢查返回值的任何東西,他們可能會返回不同的錯誤...

fopen() - 返回一個成功的文件指針資源,或錯誤的FALSE。

事實上,所有的文件函數在出錯時都會返回false。

要找出它失敗的地方,我會推薦使用調試器,或者在save_image函數中打印出一些信息。即$ inPath和$ outPath是什麼,所以你可以驗證他們正在通過你期望的。

0

我看到的主要問題是正則表達式可能無法捕獲完整的http://路徑。大多數網站都將其關閉並使用相對路徑。如果不存在,您應該在檢查中加入代碼。

0

你的比賽包括SRC位,那麼試試這個來代替:

preg_match_all('/(?<=src=")[^"]*.jpg/i', $data, $result); 

然後,我想這應該工作:

unset($result[0]); 
//output each img link from array 
foreach ($result as $imgurl) { 
    echo "$imgurl<br />\n"; 
    $imgn = (basename ($imgurl)); 
    echo "$imgn<br />\n"; 
    save_image($imgurl, $imgn); 
}