有趣。這是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_contents
或file_get_contents
。
如果你做了一些PHP編碼來獲得它們之間的關係,你會看到file_put_contents
正在返回壓縮的數據。 但是file_put_contents
從哪裏得到它的數據? 當然是來自網絡!
現在,讓我來介紹一個名爲Wireshark
的軟件。 這些軟件被稱爲數據包嗅探器 s,他們可以告訴你通過你的網絡電纜或wifi的原始數據。
注意:數據包嗅探器並不容易。你需要知道的網絡協議真的以及有意義的任何東西。 它們屬於一類低級調試器,稱爲系統監視器,並且往往是最後的度假村。 但是,這最後一手牌是一個一般的程序員和專家之間的區別之一。)
事實上,用數據包嗅探器,我們可以確認該服務器使用gzip編碼的內容響應,使用Content-Encoding: gzip
。
所以,我們現在知道真正的原因是file_get_contents
不會自動解壓縮gzip內容。 有了這個正確的問題,stackoverflow已經有答案。
這是我們如何對待幾乎每一個編程問題,爲什麼我們回答超過我們問。
希望你喜歡這個旅程,並希望有一天你會成爲導遊。