【问题标题】:Save image from URL using PHP (saves in 0KB file size)使用 PHP 从 URL 保存图像(保存为 0KB 文件大小)
【发布时间】:2013-06-06 02:51:43
【问题描述】:

我正在尝试做的事情:

file_get_contents() 在线图像,然后将其保存到我服务器上的目录中,并使用新文件名。 保存路径/目录是可写。 CHMOD 权限:777


我的尝试:

  • file_put_contents($filepath, file_get_contents($image_url)); // 保存 0KB 图像

  • copy($image_url,$filepath); // 保存 0KB 图像

  • cURL // 保存 0KB 图像

所以我已经很困惑为什么这些都不起作用,什么时候应该......


以下是我的 PHPinfo 中的相关值:

allow_url_fopen = On  
allow_url_include = On  
open_basedir = no value  

post_max_size = 8M  
upload_max_filesize = 50M  
upload_tmp_dir = no value  

max_execution_time = 18000  
max_file_uploads = 20  
max_input_nesting_level = 64  
max_input_time = 60  
max_input_vars = 1000  
memory_limit = 256M

这是我的完整 PHP 代码(我现在正在使用一个函数来保存图像,因为 我几乎绝望地尝试任何事情):

function save_image($inPath,$outPath)
{ // Download images from remote server
    $in=    fopen($inPath, "rb");
    $out=   fopen($outPath, "wb");
    while ($chunk = fread($in,8388608))
    {
        fwrite($out, $chunk, 8388608);
    }
    fclose($in);
    fclose($out);
}

// THE ORIGINAL IMAGE TO GET
$image_url = 'http://m1.i.pbase.com/u38/antidote3/upload/31848351.Cute.jpg';

// THE IMAGE EXTENSION
$image_type = substr(strrchr($image_url,"."),1);

// THE NEW FILE NAME
$filename   = 'product5_'. md5($image_url . $sku).'.'.$image_type;

// THE SAVE PATH
// OUTPUT: /var/www/site/media/catalog/product/FILE_NAME.FILE_TYPE
$filepath   = Mage::getBaseDir('media') . DS . 'catalog'. DS . 'product'. DS . $filename;

// SAVE THIS BIATCH!
save_image($image_url, $filepath);

// OTHER SAVE METHODS
// file_put_contents($filepath, file_get_contents($image_url));
// copy($image_url,$filepath);

在图片上运行strlen(file_get_contents($image_url))会返回一个大胖子0
但是它不应该在我的服务器上启用以下功能吗?

allow_url_fopen = On  
allow_url_include = On

显然,问题不在于写作,但file_get_contents($image_url) 里面没有任何内容。

任何想法为什么?谢谢!


其他信息:

  • 平台:Magento
  • 语言:PHP
  • PHP 版本:5.4.6

【问题讨论】:

  • 尝试在$image_type = substr(strrchr($image_url,"."),1); 中使用":" 而不是".",从我可以从PHP 手册(示例#1)php.net/manual/en/function.strrchr.php 中得知
  • 在您的服务器上运行任何安全扩展,如 suhosin?图像服务器也可能被配置为不喜欢标准的 PHP 请求标头并拒绝准确地传递内容以防止自动脚本抓取它们的内容。我相信您已经获得了将这些图像放到您的服务器上的书面许可 - 您是否已联系其他管理员寻求帮助?
  • 那么这可能是您自己的托管商的一项安全措施,可以防止 PHP 脚本通过 HTTP 获取任何内容。你必须和他们谈谈这件事。
  • 我能够通过 file_get_content 获得它,而无需做任何愚蠢的事情。由于她通过 curl 和 fopen 获得了相同的结果,我猜这个问题是防火墙规则。 @Love 如果您在机器上具有 shell 访问权限,请尝试从命令行执行 wget。还要确保在 php 脚本上启用了错误显示错误和错误报告。
  • 另一个测试是尝试通过从其他服务器(包括它自己)拉取来测试进程。

标签: php image image-processing curl


【解决方案1】:

也许您应该尝试这样的事情(以正确的方式使用 feof 和 fread!)- 我还更改了您获取扩展程序的方式:

<?php
function save_image($inPath, $outPath) {
  $in  = fopen($inPath,  "rb");
  $out = fopen($outPath, "wb");

  while (!feof($in)) {
    $read = fread($in, 8192);
    fwrite($out, $read);
  }

  fclose($in);
  fclose($out);
}

// THE ORIGINAL IMAGE TO GET
$image_url = 'http://m1.i.pbase.com/u38/antidote3/upload/31848351.Cute.jpg';

// THE IMAGE EXTENSION
$image_type = end(explode(".", $image_url));

// THE NEW FILE NAME
$filename   = 'product5_'. md5($image_url . $sku).'.'.$image_type;

// THE SAVE PATH
// OUTPUT: /var/www/site/media/catalog/product/FILE_NAME.FILE_TYPE
$filepath   = Mage::getBaseDir('media') . DS . 'catalog'. DS . 'product'. DS . $filename;

// SAVE THIS BIATCH!
save_image($image_url, $filepath);
?>

【讨论】:

  • 您好,感谢您的意见。我肯定不止一次地尝试过这种方法,它在所有情况下都将上传置于看似无限循环的状态(页面无法成功加载,但浏览器似乎即将加载)。不知道为什么会触发这样的反应……
  • 更新了我的代码以使用end(explode(".", $image_url));,为你+1。
  • 我测试了这段代码,对我来说效果很好。此时问题仍然存在于其他地方,可能是服务器端。尝试检查phpinfo() 以确保允许/启用网址打开。
【解决方案2】:

我不确定它会有所帮助。你可以试试这个方法吗?

function save_image($inPath,$outPath) {
  $inbuf = file_get_contents($inPath);
  $fp = fopen($outPath,'w');
  fwrite($fp,$inbuf);
  fclose($fp);
}

注意:这是一个错字,$buf 而不是 $inbuf。

【讨论】:

  • 感谢您的意见,遗憾的是修改并没有改变任何东西。 0KB 上保存的图片一样。
  • 你能再试一次,把$buf改成$inbuf吗?
  • 仍然没有运气,同样的结果。谢谢!
【解决方案3】:

答案是:服务器上的防火墙规则导致了它。感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-17
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多