我正在寻找一种使用PHP将图像从远程服务器导入/复制到本地文件夹的简单方法。我无法通过FTP访问服务器,但是可以通过HTTP(即http://www.mydomain.com/myimage.jpg)访问所有远程图像。
用法示例:用户希望将图像添加到其个人资料中。该图像已经存在于Web上,并且用户提供了直接URL。我不希望对图像进行热链接,而是从我的域中导入并提供服务。
我正在寻找一种使用PHP将图像从远程服务器导入/复制到本地文件夹的简单方法。我无法通过FTP访问服务器,但是可以通过HTTP(即http://www.mydomain.com/myimage.jpg)访问所有远程图像。
用法示例:用户希望将图像添加到其个人资料中。该图像已经存在于Web上,并且用户提供了直接URL。我不希望对图像进行热链接,而是从我的域中导入并提供服务。
Answers:
如果您在服务器上启用了PHP5和HTTP流包装器,则将其复制到本地文件非常简单:
copy('http://somedomain.com/file.jpeg', '/tmp/file.jpeg');
这将照顾所有需要的流水线等。如果您需要提供一些HTTP参数,则可以提供第三个“流上下文”参数。
http://desmond.imageshack.us/Himg100/scaled.php?server=100&filename=desertoh.jpg&res=crop
?
使用
$imageString = file_get_contents("http://example.com/image.jpg");
$save = file_put_contents('Image/saveto/image.jpg',$imageString);
PHP具有内置函数file_get_contents(),该函数将文件的内容读取为字符串。
<?php
//Get the file
$content = file_get_contents("http://example.com/image.jpg");
//Store in the filesystem.
$fp = fopen("/location/to/save/image.jpg", "w");
fwrite($fp, $content);
fclose($fp);
?>
如果希望将文件存储在数据库中,只需使用$ content变量,而不要将文件保存到磁盘。
这是最基本的方法:
$url = "http://other-site/image.png";
$dir = "/my/local/dir/";
$rfile = fopen($url, "r");
$lfile = fopen($dir . basename($url), "w");
while(!feof($url)) fwrite($lfile, fread($rfile, 1), 1);
fclose($rfile);
fclose($lfile);
但是,如果您要执行大量操作(或您的主机阻止对远程系统的文件访问),请考虑使用CURL,它效率更高,速度稍快并且可以在更多共享主机上使用。
您还可以欺骗用户代理,使其看起来像台式机而不是机器人!
$url = "http://other-site/image.png";
$dir = "/my/local/dir/";
$lfile = fopen($dir . basename($url), "w");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)');
curl_setopt($ch, CURLOPT_FILE, $lfile);
fclose($lfile);
curl_close($ch);
对于这两个实例,您可能希望通过GD传递它以确保它确实是映像。
curl_exec($ch)
之前curl_close($ch)
,并fclose($ch)
应置于末尾,而不是之前curl_close($ch)
,这意味着关闭该文件之前,什么也没有写入文件,因此你只能得到一个空文件。
使用file_get_contents非常简单。只需提供url作为第一个参数即可。
创建文件夹并将其命名为示例下载打开记事本并插入此代码
仅将http://www.google.com/aa.zip更改为文件并将其保存到m.php例如
将php文件更改为666,并将文件夹下载至777
<?php
define('BUFSIZ', 4095);
$url = 'http://www.google.com/aa.zip';
$rfile = fopen($url, 'r');
$lfile = fopen(basename($url), 'w');
while(!feof($rfile))
fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ);
fclose($rfile);
fclose($lfile);
?>
最后从您的浏览器输入以下URL http://www.example.com/download/m.php
您将在下载文件夹中看到从其他服务器下载的文件
谢谢
由于您已将问题标记为“ php”,因此我假设您的服务器上正在运行php。最好的选择是,如果您控制自己的Web服务器,则将cURL编译为php。这将允许您的Web服务器向其他Web服务器发出请求。从安全角度来看,这可能非常危险,因此大多数基本的Web托管提供商都不会启用此选项。
这是有关使用cURL的php手册页。在注释中,您可以找到下载和映像文件的示例。
如果您不想使用libcurl,则可以使用fsockopen编写一些代码。这是php内置的(但可能在您的主机上被禁用),并且可以直接读写套接字。请参见fsockopen手册页上的示例。
对于那些需要保留原始文件名和扩展名的人
$origin = 'http://example.com/image.jpg';
$filename = pathinfo($origin, PATHINFO_FILENAME);
$ext = pathinfo($origin, PATHINFO_EXTENSION);
$dest = 'myfolder/' . $filename . '.' . $ext;
copy($origin, $dest);