我一直在使用以下功能从经销商处下载图片,以便在我们的网站上使用here:
$url = "http://covers.stl-distribution.com/7819/lg-9781936417445.jpg";
$itemnum = 80848;
$path = "www.gullions.com/localstore/test/test.jpg";
header('Content-type: image/jpeg');
$ch = curl_init($url);
$fp = fopen("http://www.gullions.com/localstore/test/test.jpg", 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);
fclose($fp);
它不会下载和保存图片,而只会将疯狂的字符打印到屏幕上。我知道这意味着由于某种原因,浏览器正在尝试渲染图片,但很可能无法识别文件类型。但我似乎无法找到问题所在。你可以通过navigating here看到疯狂的输出。要验证图片是否未下载和保存,您可以navigate here。此外,FTP还显示没有下载文件。如果您导航到original picture's download url,您会看到我们尝试下载的文件确实存在。
我已联系我的主机,并确认服务器未更改任何设置,cURL正常运行,甚至已回滚浏览器以验证最近的更新未导致问题。我通过从应用程序中删除该函数创建了一个测试文件,并尝试单独运行它,但只有相同的结果。
答案 0 :(得分:3)
添加:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
默认情况下,此参数为false
。 Docs read:
TRUE以将返回值作为字符串返回 curl_exec()而不是直接输出。
修改强>
设置CURLOPT_RETURNTRANSFER
使curl_exec()
返回数据,因此应手动编写,如下所示:
$url = "http://covers.stl-distribution.com/7819/lg-9781936417445.jpg";
$ch = curl_init($url);
$fp = fopen("./test.jpg", 'wb');
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_HEADER, 0);
fwrite($fp, curl_exec($ch));
curl_close($ch);
fclose($fp);
此代码使用CURLOPT_FILE
对我来说也很合适:
$url = "http://covers.stl-distribution.com/7819/lg-9781936417445.jpg";
$ch = curl_init($url);
$fp = fopen("./test.jpg", 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);
所以我基本上怀疑你的文件句柄无效,因此cURL会回退到默认输出。尝试使用基本错误检查此代码(您应始终检查错误):
$url = "http://covers.stl-distribution.com/7819/lg-9781936417445.jpg";
$fp = fopen("./test.jpg", 'wb');
if( $fp != null ) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);
} else {
exit('ERROR: Failed to open file');
}
请注意,我的示例写入脚本所在的相同文件夹。除非您的服务器获得严重错误的文件权限,否则它必须正常工作。如果它适合您,那么请调查(通常)用户脚本运行是否可以写入目标文件夹。
答案 1 :(得分:2)
您没有告诉您的浏览器期望什么类型的文件,因此它可能默认为text/plain
。
至少需要:
header('Content-type: image/jpeg');
同样,curl默认输出它提取的任何内容,除非你明确告诉它你想要返回获取的数据,或者直接保存到文件中。