【问题标题】:Best way to store an image from a url in php?在 php 中存储来自 url 的图像的最佳方法?
【发布时间】:2009-01-28 14:08:31
【问题描述】:

我想知道从 php 中的 URL 保存图像的最佳方法。

目前我正在使用

file_put_contents($pk, file_get_contents($PIC_URL));

这并不理想。我无法使用卷曲。有没有专门针对这个的方法?

【问题讨论】:

  • 为什么不理想?有哪些限制因素?
  • 我只是假设它并不理想,它看起来太像黑客了
  • 非常好,非常清晰。不这样做的唯一原因是文件非常大。

标签: php


【解决方案1】:

使用 file_get_contents 很好,除非文件非常大。在这种情况下,您实际上不需要将整个内容保存在内存中。

对于大型检索,您可以fopen 远程文件,fread 它,比如说,一次 32KB,然后在本地循环fwrite 它,直到所有文件都被读取。

例如:

$fout = fopen('/tmp/verylarge.jpeg', 'w');
$fin = fopen("http://www.example.com/verylarge.jpeg", "rb");
while (!feof($fin)) {
    $buffer= fread($fin, 32*1024);
    fwrite($fout,$buffer);
}
fclose($fin);
fclose($fout);

(为简单起见,没有错误检查!)

或者,您可以放弃使用 url wrappers 并使用 PEAR 的 HTTP_Request 之类的类,或者使用 fsockopen 等滚动您自己的 HTTP 客户端代码。这将使您能够执行高效的操作,例如发送 If-Modified-Since 标头如果您正在维护远程文件的缓存。

【讨论】:

  • 这比我的简单方法效率高吗?
  • 它会消耗更少的内存,因为脚本只保存 32KB 的图像数据。
  • 你甚至不必缓冲它。
  • 一种或另一种方式,你正在缓冲它
  • 确实如此,但您不会对其进行冗余缓冲。
【解决方案2】:

我建议使用 Paul Dixon 的策略,但将 fopen 替换为 fsockopen()。原因是某些服务器配置不允许 fopen() 和 file_get_contents() 访问 URL。该设置可以在 php.ini 中找到,名为 allow_url_fopen。

【讨论】:

  • 但由于他使用的是带有 url 包装器的 file_get_contents,所以这不适用
  • 他可能没有意识到这个问题。因此,便携式解决方案将删除 fopen() 和 file_get_contents()。
猜你喜欢
  • 2012-10-29
  • 1970-01-01
  • 2011-01-27
  • 2023-03-10
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
相关资源
最近更新 更多