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

时间:2015-02-08 04:21:41

标签: php image file

我用的是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 个答案:

答案 0 :(得分:1)

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

我将通过阐述如何解决这类问题来回答这个问题。 解决问题是解决问题的简单方法,并逐一检查较小的部分,直到确定原因为止。


首先,你得到了什么保存?

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

在您的情况下,我相信您确实获得了该文件。 现在问题出现在实际数据


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

有效!这就是我们确认源工作正常的方式,并且ACDSee正在工作。 (实际上OS /浏览器/网络正在运行。)

将保存的数据留给我们。 没有程序可以将它作为jpeg打开,所以我们可以非常肯定保存的文件不是jpeg。

那是什么呢?

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

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

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

  

注意:十六进制比较在排除偶然的奇怪问题时非常有用,例如不需要的bom标记,二进制文件的换行符转换或凌乱的服务器过滤器。   因此,对于优秀的程序员,甚至是网络程序员来说,十六进制编辑器是不可或缺的。


在这个阶段,问题变成了,为什么我得到一个gzip压缩文件? 一个网络程序员现在应该知道什么是错的,但是让我们假设我们没有。

剩下的问题空间不大。 它可以是file_put_contentsfile_get_contents

如果你做一些PHP编码来介入它们之间,你会发现file_put_contents正在返回gzip压缩数据。 但file_put_contents在哪里获取数据? 当然,来自网络!

现在,让我介绍一下名为Wireshark的软件。 这些软件称为数据包嗅探器,它们可以显示通过网络电缆或wifi的原始数据。

  

注意:数据包嗅探器并不容易。您需要了解真正的网络协议才能理解任何。   它们属于一类称为系统监视器的低级调试器,通常是最后程序。   但最后一手是普通程序员和专家之间的区别之一。)


实际上,使用数据包嗅探器,我们可以使用Content-Encoding: gzip确认服务器正在使用gzip编码内容进行响应。

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


这就是我们处理几乎所有编程问题的方法,以及为什么我们回答的问题比我们要求的要多。

希望你喜欢这段旅程,希望有一天你能成为导游。