【发布时间】:2011-07-22 05:05:20
【问题描述】:
我正在构建一个网络爬虫,它的功能之一就是下载图片。
问题是有时,由于某种原因,下载的图像有错误,例如:一半的图像是纯灰色或白色的,就像它在某个时候停止下载一样,然后用灰色的。图像类型仍然被认为是有效的,因为我可以使用 getimagesize 获取它们,也可以打开并查看它们。但它们与原版不同。
有什么想法吗?
【问题讨论】:
标签: php image mime-types integrity getimagesize
我正在构建一个网络爬虫,它的功能之一就是下载图片。
问题是有时,由于某种原因,下载的图像有错误,例如:一半的图像是纯灰色或白色的,就像它在某个时候停止下载一样,然后用灰色的。图像类型仍然被认为是有效的,因为我可以使用 getimagesize 获取它们,也可以打开并查看它们。但它们与原版不同。
有什么想法吗?
【问题讨论】:
标签: php image mime-types integrity getimagesize
只需执行 imagecreatefromstring() 并检查是否返回不是资源
【讨论】:
将响应标头Content-Length 与您收到的实际字节数进行比较。可能还有其他原因,但如果没有看到您下载该图像的代码,我什么也说不出来。
【讨论】:
== 就足够了,否则您必须添加strlen($response['body']) === intval($response['content_length']),因为标头通常以字符串形式保存。
我认为这是传输中断。
我看到很多情况:要么您的连接已被重置,在这种情况下测试套接字信号应该使您能够诊断问题并重新启动下载。
或者在传输过程中出现未检测到的错误(但通常 TCP/IP 应该处理这个问题)和/或您没有正确写入所有下载的内容(您认为您读取了套接字上的所有数据,但 read 提供了一个最小值,并且您不检查返回的值来检查它是否是预期的大小),然后您的图像不完整。
通常半灰色图像(尤其是 JPEG)是文件不完整的标志(标题没问题,所以你的 getimagesize 没有问题)但 JPEG 不以0xFF 0xD9 结尾。因此,通过与您必须阅读的大小进行比较来检查您是否阅读了所有数据。
最终,您可以编写依赖于图像格式的函数来检查文件的完整性,例如通过检查 JPEG 中的标志。但这可能会消耗资源。
【讨论】: