【问题标题】:Copy Image from Remote Server Over HTTP通过 HTTP 从远程服务器复制图像
【发布时间】:2010-10-28 21:43:35
【问题描述】:

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

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

【问题讨论】:

  • 服务器没有代理模块吗?

标签: php image import curl copy


【解决方案1】:

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

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

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

【讨论】:

  • 记住 allow_url_fopen 在 php.ini 中必须为 = on。
  • allow_url_fopen 评论刚刚解决了一个多小时令人头疼的问题。谢谢,@mauro.dec!
  • http://desmond.imageshack.us/Himg100/scaled.php?server=100&filename=desertoh.jpg&res=crop这样的网址在做什么???
  • 感谢您的回答 - 我想我快到了!当您说“/tmp/file.jpg”时,它与什么相关? Web 服务器的根目录...(例如:/var/www/vhosts 等)或网站的根目录:/httpdocs/... ??看不到文件出现,我将 url-fopen 设置为 ON。 !!
  • 不要使用 https,只使用 http
【解决方案2】:

使用

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

【讨论】:

  • 谢谢哥们!!第二个解决方案正在工作..最重要的解决方案对我不起作用:p
  • 小文件的好提示,但对于较大的文件,php 内存会爆炸:(
【解决方案3】:

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

<?php
//Get the file
$content = file_get_contents("@987654321@");

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

【讨论】:

  • 使用 curl 是一个好方法,因为一些服务器人员出于安全原因不支持 file_get_contents
  • 小文件的好提示,但对于较大的文件,php 内存会爆炸:( curl 也不是好的选择,因为它不是标准 php 的一部分
【解决方案4】:

你有这四种可能性:

  • Remote files。这需要在php.ini中启用allow_url_fopen,但这是最简单的方法。

  • 如果您的 PHP 安装支持,您也可以使用 cURL。甚至还有example

  • 如果您真的想手动操作,请使用HTTP module

  • 甚至不要尝试use sockets directly

【讨论】:

  • 为什么“甚至不尝试直接使用套接字。”? (这是我正在使用的,gist.github.com/0893a7ec908ff508aac6
  • @Gajus:你没有直接在那个 sn-p 中使用套接字。您正在使用 php 的功能打开远程文件。
【解决方案5】:

这是最基本的方法:

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

【讨论】:

  • 要使用 GD 检查图像,请考虑在保存文件后立即运行此命令:psoug.org/snippet/Check_if_an_image_exists_GD_364.htm - 如果返回 false,请立即删除文件。
  • 你在curl_close($ch)之前错过了curl_exec($ch),并且fclose($ch)应该放在最后而不是curl_close($ch)之前,这意味着在没有写入文件之前关闭文件,因此你只会得到一个空文件。
【解决方案6】:

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

【讨论】:

  • 出于安全原因,这被锁定在许多共享主机上的本地文件系统中。 cURL 更好、更快、更强等等……而且通常在那些阻止远程文件系统上的 fopen 的主机上可用。
  • 如果 cURL 可用,那就更好了。请参阅 se2.php.net/curl">cUrl at php.net
【解决方案7】:

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

例如,只需将 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);
?>

最后从您的浏览器输入这些网址 http://www.example.com/download/m.php

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

谢谢

【讨论】:

    【解决方案8】:

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

    由于您使用的是 PHP,您可以使用curl 从其他服务器下载文件。

    【讨论】:

      【解决方案9】:

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

      这是php man page on using cURL。在 cmets 中,您可以找到下载和图像文件的示例。

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

      【讨论】:

        【解决方案10】:

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

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

        【讨论】:

          【解决方案11】:

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

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

          【讨论】:

            猜你喜欢
            • 2013-10-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-10
            相关资源
            最近更新 更多