2009-05-26 49 views
77

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

示例使用:用户希望将图像添加到他的个人资料。该图片已经存在于网络上,并且用户提供了一个直接的URL。我不希望将图像热链接,而是从我的域名导入和投放。

+0

不要在服务器有这个代理模块? – jiggunjer 2017-10-24 09:16:37

回答

142

如果你有PHP5和你的服务器上启用的HTTP流包装,这是令人难以置信的简单将其复制到本地文件:

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

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

0

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

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

2

这是非常简单的使用file_get_contents。只需提供网址作为第一个参数。

+1

出于安全原因,这被锁定到许多共享主机上的本地文件系统。cURL更好,更快,更强大等...并且通常在阻止远程文件系统上打开的主机上可用。 – Oli 2009-05-26 07:46:27

+0

如果cURL可用,那会更好。请参阅cUrl at php.net PatrikAkerstrand 2009-05-26 08:12:49

7

你已经得到了有关这四种可能性:

+0

为什么“甚至不尝试直接使用套接字”? (这是我使用的,https://gist.github.com/0893a7ec908ff508aac6) – Gajus 2012-11-16 00:45:36

+0

@Gajus:你不直接在该代码段中使用套接字。您正在使用php的功能打开远程文件。 – 2012-11-16 09:10:49

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

但是如果你做很多很多的这个(或您的主机阻止文件访问远程系统),可以考虑使用卷曲,这是更高效,速度更快,并可在更多共享主机上使用。

您还可以欺骗用户代理看起来像桌面而不是机器人!

$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检查图像,请考虑在保存文件后立即运行此文件:http://www.psoug.org/snippet/Check_if_an_image_exists_GD_364.htm - 如果它返回false,请立即删除文件。 – Oli 2009-05-26 07:54:11

+2

在`curl_close($ ch)`之前,你错过了`curl_exec($ ch)`,`fclose($ ch)`应该放在最后,而不是`curl_close($ ch)`之前,这意味着在关闭文件之前没有文件写入文件,因此您只会得到一个空文件。 – 2010-12-06 09:54:53

0

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

这是php man page on using cURL。在评论中你可以找到一个下载和图像文件的例子。

如果你不想使用libcurl,你可以使用fsockopen编写代码。这是内置到PHP(但可能会禁用您的主机),并可以直接读取和写入套接字。见Examples on the fsockopen man page

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出于安全原因 – 2012-02-20 09:10:41

2

新建文件夹并将其命名为敌人例如下载 打开记事本并插入该代码

只能改变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); 
?> 
从浏览器

终于进入到这些网址 http://www.example.com/download/m.php

你会在下载文件夹中看到来自其他服务器的文件下载

感谢

26

使用

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

我试图复制/使用复制功能behint代理下载远程文件,但复制无需代理直接连接。

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

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

Here's我的代码:

$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)(配置为apache模块)

已启用urlfopen http和https流注册为php

-2

This answer帮助我将图像从服务器下载到客户端。

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

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

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

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

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

copy($origin, $dest);