Php 如何使用cURL在远程服务器上下载文件?

Php 如何使用cURL在远程服务器上下载文件?,php,curl,download,remote-access,Php,Curl,Download,Remote Access,我一直在互联网上搜索,也有很多来自SO的帖子,但都没有运气。我有以下代码从远程服务器获取文件 $url = 'http://www.example.com/images/abc.png'; $path = '/home/axxxxxxx/public_html/images/abc.png'; $fp = fopen($path, 'w'); $ch = curl_init($url); curl_setopt($ch, CURLOPT_FILE, $fp); $data = curl_

我一直在互联网上搜索,也有很多来自SO的帖子,但都没有运气。我有以下代码从远程服务器获取文件

$url  = 'http://www.example.com/images/abc.png';
$path = '/home/axxxxxxx/public_html/images/abc.png';

$fp = fopen($path, 'w');

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FILE, $fp);

$data = curl_exec($ch);

curl_close($ch);
fclose($fp);
$url
$path
表示来自一台服务器的文件。当我运行代码时,html页面输出一个奇怪的代码,它以
‰PNG IHDRáw=øIDATxÚyLWÚ3³3ì(VP)áUÓzDc«
开头

当我使用文本编辑器打开new.png时,得到的代码与上面php cURL脚本所在页面中的代码完全相同。(脚本似乎读取了正确的文件)

我还收到错误消息说

  • 警告:fopen(../axxxxxxx/public_html/images/new.png)[function.fopen]:无法打开流:第5行的/home/ayyyyyyy/public_html/test.php中没有这样的文件或目录
  • 警告:curl_setopt():提供的参数不是第8行/home/ayyyyyyy/public_html/test.php中的有效文件句柄资源
此处显示的unicode字符集(
PNG IHDRáw=øIDATxÚ•yLWÚ3³3ìì²(VP)ÓUÓzDc«

  • 警告:fclose():提供的参数不是第12行/home/ayyyyyyy/public_html/test.php中的有效流资源
如果有必要,这两个网站都托管在000webhost.com上

如何将文件下载到用户的计算机?

问题是(如果有)您正在下载的文件是一个
PNG
文件,您试图将其作为文本文件读取-这是您看到的“奇怪代码”

如果在将文件输出到浏览器之前发送了
内容类型
标题,您将看到实际图像:

header('Content-Type: image/png');
echo $data;
通过
将文件下载到用户的计算机
,我假设您的意思是希望提示用户下载文件。为此,请将
内容处置
标题设置为
附件
。您也可以将其与上面的内容类型标题结合使用:

header("Content-Type: image/png");
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"some_image.png\""); 

错误消息非常清楚:未能正确打开文件句柄。您尝试将该无效文件句柄与curl/fclose一起使用,从而产生更多警告。在处理外部资源时,永远不要假设成功-始终检查错误情况。e、 g.fopen()失败时返回布尔值FALSE。谢谢。我试试看。我对剧本提出了很多要求。(例如,下载许多文件类型)我在php.net
read_file
函数中尝试了这个示例,但没有成功。那么错误消息呢?@Sid该错误意味着无法创建该文件,或者您没有创建/写入该文件的权限。尝试将
/images/
文件夹上的权限更改为0777,然后查看它是否有效。@Sid您确定路径正确吗?也许可以尝试
$path=$\u服务器['DOCUMENT\u ROOT']/图像/'?或者,如果images文件夹与正在运行的脚本相对,则可以尝试相对路径:
$path='images/
@newfurnity,我在
fopen()
上遇到了同样的问题,使用
$\u服务器['DOCUMENT ROOT']
解决了这个问题。谢谢你的提示!