PHP 下载远程图片到本地后只显示部分内容是什么情况?

2022-04-15 11:34:15 +08:00
 s609926202
$url = "http://baidu.com/img.png";
$path = "img.png";
$fp = fopen($path, 'w+');
$ch = curl_init();
curl_setopt($ch, CURLOPT_ENCODING,'gzip');
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_FILE, $fp); // 用于传输的文件流,默认是 STDOUT
$output = curl_exec($ch);
if ($output === false) {
	throw new \Exception("文件下载失败:$url");
} else {
	fclose($fp);
	curl_close($ch);
}

虽然下载成功了,但是打开图片后仅有原图的部分,另一部分显示为灰色。 怎么改进一下?或者是什么原因造成的。

1967 次点击
所在节点    PHP
11 条回复
chengyiqun
2022-04-15 11:40:57 +08:00
没用过 php, 我猜是这个下载方法是异步的, 实际上没下完, 你就关闭流了.
bixchen
2022-04-15 11:42:02 +08:00
整复杂了,直接 file_get_contents 获取文件流写入本地文件就行了
lait123
2022-04-15 11:49:19 +08:00
file_get_contents 会出现 https 的一些问题,所以还是的 curl
skiy
2022-04-15 12:07:14 +08:00
前段时间才了解到 file_get_contents 的强大。非常好用。
sleepm
2022-04-15 12:15:16 +08:00
@lait123 https://www.php.net/stream_context_create
file_get_contents 第三个参数是上下文
可以参考
https://github.com/JonnyBo71/office-module/blob/main/Helpers/OfficeFunctions.php#L113=

图片显示不正确,也有可能原图是 jpg ,然后存成了 png
dzdh
2022-04-15 13:20:45 +08:00
经常碰到的一个问题。

取 response header 的 content-length 取到的图片内容做比对。小于就重新尝试下载。
dajj
2022-04-15 13:24:34 +08:00
是不是开启了 gzip 压缩的原因 , 通常原始的方式处理数据, 压缩了要自己解压
s609926202
2022-04-15 13:52:49 +08:00
@dajj gzip 压缩,是提示图片损坏吧,应该和 gzip 压缩无关
dajj
2022-04-15 17:44:17 +08:00
可以对比下字节数,有没有少了
lslqtz
2022-04-15 23:36:29 +08:00
最近同样遇到这个问题,是 file_get_contents ,中间没有报错。
lslqtz
2022-04-15 23:39:46 +08:00
@chengyiqun 这个方法是同步的,会阻塞线程。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/847106

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX