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

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

使用示例:用户希望将图像添加到他的个人资料。 该图像已经存在于networking上,用户提供了一个直接的URL。 我不希望热链接的形象,但导入和服务从我的领域。

如果您的服务器上启用了PHP5和HTTPstream包装器,将其复制到本地文件非常简单:

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

这将需要照顾任何stream水线等。 如果您需要提供一些HTTP参数,则可以提供第三个“stream上下文”参数。

使用

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

PHP有一个内置函数file_get_contents(),它将文件的内容读入string。

 <?PHP
 //获取文件
 $ content = file_get_contents(“ http://example.com/image.jpg ”); 

//保存在文件系统中
$ fp = fopen(“/ location / to / save / image.jpg”,“w”);
fwrite($ fp,$ content);
FCLOSE($ FP);
?>
如果您希望将文件存储在数据库中,只需使用$ contentvariables,不要将文件保存到磁盘。

你有这四种可能性:

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

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

  • 如果你真的想手动使用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,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来确保它确实是一个图像。

使用file_get_contents非常简单。 只要提供url作为第一个参数。

将文件夹命名为例如下载打开的记事本并插入此代码

只需将http://www.google.com/aa.zip更改为您的文件并将其保存为m.php

chamod 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); ?> 

最后从你的浏览器input这些URL http://www.example.com/download/m.php

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

谢谢

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

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

既然你已经标记了你的问题“PHP”,我会假设你的服务器上运行的PHP。 你最好的select是如果你控制自己的Web服务器,然后编译cURL到PHP。 这将允许您的Web服务器向其他Web服务器发出请求。 从安全的angular度来看,这可能是非常危险的,所以大多数基本的虚拟主机提供商都不会启用此选项。

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

如果你不想使用libcurl,你可以用fsockopen编写代码。 这是内置到PHP(但可能会禁用您的主机),并可以直接读取和写入套接字。 请参阅fsockopen手册页上的示例 。

我试图复制/下载远程文件使用复制functionbehint代理,但复制直接连接没有代理。

我试图将我的设置设置为默认的上下文,并将其作为3.函数参数进行复制。

但是看起来上下文从来没有被使用,但是readfileget_headers使用相同的上下文成功。

这里是我的代码:

 $url = "http://myserver.com/testfile"; $context_opts = array( "http" => array( "proxy" => "tcp://myProxy:8080", "request_fulluri" => True, "ignore_errors" => true ) ); stream_context_get_default($context_opts); print_r(get_headers($url,1)); copy($url,$filename, stream_context_create($context_opts)); 

我的服务器正在运行:

  • Windows XP SP3
  • Apache 2.2.12(作为服务运行)
  • PHP 5.3.0(API20090626,TS,VC6)(configuration为apache模块)

urlfopen启用http和httpsstream注册为PHP

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

 $origin = 'http://example.com/image.jpg'; $filename = pathinfo($origin, PATHINFO_FILENAME); $ext = pathinfo($origin, PATHINFO_EXTENSION); $dest = 'myfolder/' . $filename . '.' . $ext; copy($origin, $dest); 

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

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