使用 file_put_contents('test/xxx.jpg', $url), 得到错误的图像

use file_put_contents('test/xxx.jpg', $url), get wrong image

我用php。
我尝试从 url 下载图像,我的代码适用于某些 url,而其他人不 work.I 希望我的代码适用于所有 url.或者告诉我是什么导致了这个。
这是我的脚本:

$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"
我的脚本有效。
请帮助我。

有意思。这是 file_get_contents 未能获得正确图像的情况,可以这么说,但我找到的最匹配的 SO 问题对你没有帮助,因为它们是关于不同的事情。

我将通过列出您应该如何解决此类问题来回答这个问题。 解决问题是分解问题的简单艺术,一个一个地检查小块,直到查明原因。


首先,你有没有保存任何东西?

如果是,那意味着你确实得到了一些东西,我们可以排除所有数据读写问题,包括文件权限、网络问题、拒绝访问或缺少 curl 扩展。 如果你没有得到保存的文件,这些问题还得一一检查。

就您而言,我相信您确实获得了该文件。 所以现在的问题是实际数据


通常,我们首先验证源是否可以。 在浏览器中打开它。保存。在 ACDSee 中打开保存的文件。

有效!这就是我们确认源正在运行并且 ACDSee 正在运行的方式。 (实际上 OS/browser/network 正在工作。)

这给我们留下了保存的数据。 没有程序可以将其打开为 jpeg,因此我们可以确定保存的文件不是 jpeg。

那是什么?

如果您使用十六进制编辑器(例如 HxD)打开 PHP 保存的文件(不是 jpeg)和手动保存的文件(已确认的 jpeg),您会发现它们完全不同。

手动保存图片:FF D8 FF E1 ...
PHP 已保存图像:1F 8B 08 ...

如果您查找这些称为 文件头 的前几个字节,您会看到 PHP 保存的文件是一个 gzip 文件。 要确认这一点,您可以将文件的扩展名重命名为 .gz。解压,中提琴就有图了!

Note: hex comparison is pretty useful in sorting out the occasional weird problems, such as unwanted bom markers, line break conversion on binary files, or messy server filters. So hex editors are indispensable for a good programmer, even a web programmer.


在这个阶段,问题变成了,为什么我得到一个 gzip 文件? Web 程序员现在应该知道哪里出了问题,但让我们假装不知道。

剩下的问题不多了space。 它是 file_put_contentsfile_get_contents.

如果您在它们之间进行一些 PHP 编码,您会看到 file_put_contents 正在返回 gzip 压缩数据。 但是 file_put_contents 从哪里得到它的数据呢? 当然是来自网络!

现在,让我向您介绍一款名为Wireshark的软件。 这些软件称为 packet sniffers,它们可以显示通过网线或 wifi 的原始数据。

Note: Packet sniffers are not easy. You need to know network protocols really well to make sense of anything. They belongs to a class of low level debuggers called system monitors, and are often the last resort. But this final hand is one of the distinctions between an average programmer and an expert.)


的确,通过数据包嗅探器,我们可以使用 Content-Encoding: gzip.

确认服务器正在使用 gzip 编码的内容进行响应

因此,我们现在知道真正的原因是 file_get_contents 没有自动解压缩 gzip 内容 。 有了这个正确的问题,Whosebug 已经有了答案。


这就是我们处理几乎所有编程问题的方式,也是我们回答的比我们问的多的原因。

希望您旅途愉快,希望您有一天能成为导游。