cURL脚本不会下载图像;而是渲染垃圾

时间:2013-07-12 18:58:39

标签: php curl

我一直在使用以下功能从经销商处下载图片,以便在我们的网站上使用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正常运行,甚至已回滚浏览器以验证最近的更新未导致问题。我通过从应用程序中删除该函数创建了一个测试文件,并尝试单独运行它,但只有相同的结果。

2 个答案:

答案 0 :(得分:3)

添加:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

默认情况下,此参数为falseDocs 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默认输出它提取的任何内容,除非你明确告诉它你想要返回获取的数据,或者直接保存到文件中。