通过 HTTP 从远程服务器复制图像

我正在寻找一个简单的方法来导入/复制图像从远程服务器到本地文件夹使用 PHP。我没有访问服务器的 FTP 权限,但所有远程映像都可以通过 HTTP (即 http://www.mydomain.com/myimage.jpg)访问。

示例使用: 用户希望在其配置文件中添加图像。该图像已经存在于网络上,用户提供了一个直接的 URL。我不希望热链接的形象,但导入和服务从我的领域。

142914 次浏览

使用 GET 请求下载图像并将其保存到服务器上可访问的 Web 目录中。

在使用 PHP 时,可以使用 curl从其他服务器下载文件。

使用 File _ get _ content非常简单,只需提供 URL 作为第一个参数。

你有这四种可能性:

  • 远程文件 。这需要在 php.ini 中启用 allow_url_fopen,但这是最简单的方法。

  • 或者你可以使用 CURL,如果你的 PHP 安装支持它。甚至有一个 例子

  • 如果你真的想手动做到这一点使用 HTTP 模块

  • 甚至不要尝试 直接使用插座

以下是最基本的方法:

$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 传递它,以确保它确实是一个映像。

既然您已经将问题标记为“ php”,那么我将假设您的服务器上正在运行 php。最好的办法是控制自己的 Web 服务器,然后将 cURL 编译成 php。这将允许您的 Web 服务器向其他 Web 服务器发出请求。从安全角度来看,这可能相当危险,因此大多数基本的 Web 托管提供商不会启用这个选项。

这是 使用 cURL 的 php 手册页。在评论中你可以找到一个下载和图像文件的例子。

如果不想使用 libcurl,可以使用 fsockopen 编写代码。这是内置在 php 中的(但可能在您的主机上禁用) ,并且可以直接读写到套接字。参见 Fsockopen 手册页上的示例

PHP 有一个内置函数 file _ get _ content () ,它将文件的内容读入一个字符串中。

< ? php
//获取文件
$content = file _ get _ content (“ http://example.com/image.jpg”) ;

//存储在文件系统中。 $fp = fopen (“/location/to/save/image. jpg”,“ w”) ; Fwrite ($fp,$content) ; Fclose ($fp) ; ? >

如果希望将文件存储在数据库中,只需使用 $content 变量,不要将文件保存到磁盘。

如果在服务器上启用了 PHP5和 HTTP 流包装器,那么将其复制到本地文件非常简单:

copy('http://somedomain.com/file.jpeg', '/tmp/file.jpeg');

这将照顾到任何管道等所需要的。如果需要提供一些 HTTP 参数,还可以提供第三个“流上下文”参数。

使文件夹和名称为例子下载 打开记事本并插入此代码

例如,只将 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

您将在下载文件夹中看到从其他服务器下载的文件

谢谢

如果没有效果,使用这个快速解决方案

$imageString = file_get_contents("http://example.com/image.jpg");
$save = file_put_contents('Image/saveto/image.jpg',$imageString);

这个回答 帮助我从服务器端下载图像到客户端。

<a download="original_file.jpg" href="file/path.jpg">
<img src="file/path.jpg" class="img-responsive" width="600" />
</a>

对于那些需要保留原始文件名和扩展名的用户

$origin = 'http://example.com/image.jpg';


$filename = pathinfo($origin, PATHINFO_FILENAME);
$ext = pathinfo($origin, PATHINFO_EXTENSION);


$dest = 'myfolder/' . $filename . '.' . $ext;


copy($origin, $dest);