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


81

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

用法示例:用户希望将图像添加到其个人资料中。该图像已经存在于Web上,并且用户提供了直接URL。我不希望对图像进行热链接,而是从我的域中导入并提供服务。


服务器没有为此的代理模块吗?
jiggunjer

Answers:


153

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

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

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


33
请记住,在php.ini中必须启用allow_url_fopen。
mauro.dec

3
allow_url_fopen注释仅用了一个多小时就解决了。谢谢@ mauro.dec!
Michael Stalker 2012年

2
像这样的URL有什么用http://desmond.imageshack.us/Himg100/scaled.php?server=100&filename=desertoh.jpg&res=crop
Yuseferi

感谢您的回答-我想我快到了!当您说“ /tmp/file.jpg”时-相对于什么?Web服务器的根目录...(例如:/ var / www / vhosts等)或网站的根目录:/ httpdocs / ...?无法看到出现的文件,并且我已将url-fopen设置为ON。!!
itsricky

1
不要使用https,只需使用http
edCoder,2015年

31

使用

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

谢啦!!第二个解决方案正在工作..最重要的解决方案对我
不起作用

4
小文件的好提示,但大文件的php内存将爆炸:(
Radon8472 2014年

10

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变量,而不要将文件保存到磁盘。


2
使用curl是一个好方法,因为出于安全原因,某些服务器人员不支持file_get_contents
Rinto George 2012年

1
小文件的提示,但大文件的php内存会爆炸:( curl也不是一个好选择,因为它不属于标准php
Radon8472 2014年

7

您已经了解了以下四种可能性:


为什么要“甚至不要尝试直接使用套接字”。(这是我在用,gist.github.com/0893a7ec908ff508aac6
Gajus

@Gajus:您不是在该代码段中直接使用套接字。您正在使用php的功能来打开远程文件。
GeorgSchölly2012年

4

这是最基本的方法:

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


1
要使用GD检查映像,请考虑在保存文件后立即运行此命令:psoug.org/snippet/Check_if_an_image_exists_GD_364.htm-如果返回false,请立即删除文件。
奥利

4
你错过了curl_exec($ch)之前curl_close($ch),并fclose($ch)应置于末尾,而不是之前curl_close($ch),这意味着关闭该文件之前,什么也没有写入文件,因此你只能得到一个空文件。
亨德拉·乌齐亚


2

创建文件夹并将其命名为示例下载打开记事本并插入此代码

仅将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

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

谢谢


0

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

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


0

由于您已将问题标记为“ php”,因此我假设您的服务器上正在运行php。最好的选择是,如果您控制自己的Web服务器,则将cURL编译为php。这将允许您的Web服务器向其他Web服务器发出请求。从安全角度来看,这可能非常危险,因此大多数基本的Web托管提供商都不会启用此选项。

这是有关使用cURLphp手册页。在注释中,您可以找到下载和映像文件的示例。

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


0

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

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

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

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

copy($origin, $dest);

-5

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

<a download="original_file.jpg" href="file/path.jpg">
  <img src="file/path.jpg" class="img-responsive" width="600" />
</a>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.