0

我一直在使用以下功能从经销商处下载图片,以便在我们的网站上使用,如下所述

$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);

它不会下载并保存图片,只会将疯狂的字符打印到屏幕上。我知道这意味着由于某种原因浏览器正在尝试渲染图片,但很可能无法识别文件类型。但我似乎找不到问题所在。您可以通过在此处导航来查看疯狂的输出。要验证图像是否未下载和保存,您可以在此处导航。此外,FTP 还显示没有下载文件。如果您导航到原始图片的下载 url,您会看到我们尝试下载的文件确实存在。

我已经联系了我的主机并验证了服务器没有更改任何设置,cURL 运行正常,甚至回滚了我的浏览器以验证最近的更新没有导致问题。我通过从应用程序中删除该函数创建了一个测试文件,并尝试单独运行它,但结果相同。

4

2 回答 2

3

添加:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

默认情况下,此参数为false. 文档阅读

TRUE 将传输作为 curl_exec() 的返回值的字符串返回,而不是直接输出。

编辑

设置CURLOPT_RETURNTRANSFERmakecurl_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');
}

请注意,我的示例写入脚本所在的同一文件夹。除非您的服务器文件权限严重混乱,否则它必须工作。如果它对您有用,那么调查(通常)您的脚本运行的用户是否可以写入您的目标文件夹。

于 2013-07-12T19:02:29.340 回答
2

你还没有告诉你的浏览器期望什么类型的文件,所以它可能默认为text/plain.

你至少需要:

header('Content-type: image/jpeg');

同样,默认情况下 curl 会输出它获取的任何内容,除非您明确告诉它您希望返回获取的数据,或者直接保存到文件中。

于 2013-07-12T19:02:39.293 回答