2012-06-16 47 views
-1

使用PHP,我試圖下載/保存下面的圖片:PHP:爲什麼此圖像無法下載?

http://www.bobshop.nl/catalog/product_image.php?size=detail&id=42428 

當你在瀏覽器中加載這個圖像,你可以看到它,但是當我嘗試使用幾種不同的方法來下載吧,我得到一個1 KB的文件,說該產品在服務器上找不到。

我試着用file_put_contentscurl的方式。 我甚至使用了我在StackOverflow上找到的函數get_web_page來捕獲可能的重定向。

還有什麼原因可以讓您在瀏覽器中看到圖片,但無法下載它?

UPDATE: 多虧了被拋出嘗試了不同的答案錯誤,我只是發現問題的真正原因。在抓取html的過程中,URL得到了&而不是&。我現在將其替換爲現在和其他所有方法...現在,謝謝大家!

+3

可能有一些頭檢查來驗證請求者實際上是瀏覽器。爲什麼不嘗試使用Google Chrome請求圖片並打開檢測器?轉到網絡選項卡。刷新頁面。複製發送的標題並使用cURL。 –

+0

我想他們有防止下載的保護措施,可能是通過檢查用戶代理字符串 –

+1

你甚至可以更進一步,使用頭文件並查看哪些組合返回圖像,哪些返回錯誤消息。 –

回答

0

我只是實現了一個簡單的方法來下載和存儲,它的工作:

<?php 

$fileContent = implode("",file("http://www.bobshop.nl/catalog/product_image.php?size=detail&id=42428")); 
$fp = fopen("/tmp/image","w+"); 

fwrite($fp, $fileContent); 

fclose($fp); 

?> 

你身後的代理?這可能是問題(你是與代理配置,但PHP不);

+0

我接受這個答案,因爲試用你的代碼指示我到真正原因:&而不是URL中的&! – Dylan

0

有可能某種類型的頭部檢查正在完成與此PHP腳本,以確保瀏覽器請求圖像,而不是有人試圖颳去他們的內容。這可以僞造(儘管做了這樣的事情後,我覺得我需要洗澡)與捲曲。具體來說,curl_setopt()

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'User-agent: Some legitimate string' 
)); 

要找出哪個頭需要發送,你需要做一些試驗。如果你有谷歌瀏覽器,你可能使用過Inspector(如果你沒有Firefox有類似的插件,那麼你可以使用類似Firebug的東西)。如果您使用Chrome請求圖片,則可以右鍵點擊進行檢查。轉到網絡選項卡。現在刷新頁面。應出現product_image.php的請求。如果您點擊它並單擊標題選項卡,您應該會看到發送的標題列表。我的瀏覽器發送:User-Agent,Accept,Accept-Encoding,Accept-LanguageAccept-Charset

enter image description here

這些標題與有效值的嘗試組合,看看哪些需要發送要返回圖像。我敢打賭,這個網站可能只檢查User-agent,所以開始與那一個。


重要提示:你應該緩存這個調用的結果,因爲如果你的服務器以快速連續多次請求圖像,這將是非常可疑的(比如說,如果您的網站上要求很多用戶的抓住這個圖像的腳本)。此外,作爲一個匿名的附加層,您可能希望從有效的數組中挑選您的User-agent,以便bobshop.nl認爲所有請求都來自大型網絡背後的用戶(如大學校園)。您可以在UserAgentString.com上找到有效的用戶代理字符串。

+0

非常感謝您的努力。問題根本不復雜,請參閱UPDATE。 – Dylan