2015-02-08 40 views
-3

我使用php。
我嘗試從網址下載圖片,我的代碼適用於某些網址,而其他網址無效。我希望我的代碼能夠適用於所有網址。或者告訴我是什麼導致了這一點。
這裏是我的腳本:

$imgUrl = 'http://www.inc.com/uploaded_files/image/i-love-me_49961.jpg'; 
$imageData = file_put_contents('test/xxx.jpg', file_get_contents($imgUrl)); 

現在,我能得到這個映像文件(XXX.JPG),
但是當我打開ACDSee的保存的文件,我什麼也沒得到。
但是,如果我使用
"http://www.wired.com/wp-content/uploads/2014/11/faa-drones-ft-660x330.jpg"
我的腳本可以使用。
請幫幫我。

回答

1

有趣。這是file_get_contents沒有得到正確圖像的情況,可以這麼說,但是我發現的最匹配的SO問題不會幫助你,因爲它們是關於不同的事情。

我將通過闡述如何解決這類問題來回答這個問題。 問題解決是解決問題的簡單技巧,逐個檢查小塊,直到找出原因。


首先,你有沒有得到任何保存?

如果是,那意味着你確實得到了一些東西,並且我們可以排除包括文件權限,網絡問題,拒絕訪問或缺少捲曲擴展的所有數據讀寫問題。 如果你沒有得到保存的文件,這些問題必須逐一檢查。

就你而言,我相信你確實得到了這個文件。 所以現在的問題是用的實際數據


通常,我們首先驗證來源是否正常。 在瀏覽器中打開它。保存。在ACDSee中打開保存的文件。

它的工作原理!我們如何確認源代碼正在工作,並且ACDSee正在運行。 (實際上OS /瀏覽器/網絡正在工作)。

這就給我們保存了數據。 沒有程序可以打開它作爲jpeg,所以我們可以非常確定保存的文件不是JPEG格式。

那是什麼呢?

如果您使用十六進制編輯器(例如HxD)打開PHP保存的文件(不是jpeg)和手動保存的文件(已確認的jpeg),您將看到它們完全不同。

手動保存圖像:FF D8 FF E1 ...
PHP保存的圖像:1F 8B 08 ...

如果您查找這些前幾個字節,稱爲文件頭 S,你會看到的PHP保存的文件是一個gzip文件。 要確認這一點,您可以將文件的擴展名重命名爲.gz。解壓縮,中提琴有圖像!

注意:十六進制比較對於偶爾奇怪的問題(如不需要的bom標記,二進制文件中的換行符轉換或凌亂的服務器過濾器)非常有用。 所以十六進制編輯器對於一個好的程序員來說是必不可少的,甚至是一個網絡程序員。


在這個階段,問題就來了,爲什麼我得到一個壓縮文件? 網絡程序員現在應該知道什麼是錯誤的,但讓我們假裝我們不知道。

剩下的問題空間不多。 它可以是file_put_contentsfile_get_contents

如果你做了一些PHP編碼來獲得它們之間的關係,你會看到file_put_contents正在返回壓縮的數據。 但是file_put_contents從哪裏得到它的數據? 當然是來自網絡!

現在,讓我來介紹一個名爲Wireshark的軟件。 這些軟件被稱爲數據包嗅探器 s,他們可以告訴你通過你的網絡電纜或wifi的原始數據。

注意:數據包嗅探器並不容易。你需要知道的網絡協議真的以及有意義的任何東西。 它們屬於一類低級調試器,稱爲系統監視器,並且往往是最後的度假村。 但是,這最後一手牌是一個一般的程序員和專家之間的區別之一。)


事實上,用數據包嗅探器,我們可以確認該服務器使用gzip編碼的內容響應,使用Content-Encoding: gzip

所以,我們現在知道真正的原因是file_get_contents不會自動解壓縮gzip內容。 有了這個正確的問題,stackoverflow已經有答案。


這是我們如何對待幾乎每一個編程問題,爲什麼我們回答超過我們問。

希望你喜歡這個旅程,並希望有一天你會成爲導遊。