【问题标题】:Downloading Images from URL in PHP在 PHP 中从 URL 下载图像
【发布时间】:2015-07-06 20:46:56
【问题描述】:

我有一个文件,我在其中逐行读取 URL。 URL 是图像的链接。所有图像链接都在浏览器中工作。现在我想将它们下载到我当前的目录。为了记录,我需要使用 PHP 脚本。

这就是我获取图像的方式:

for ($j; $j< $count;$j++)

{
  // Get Image-URL as String and then do getImage
  $image = $arr[$j];
  $newname = $j;
  getImage($image, $newname);
}

function getImage($image, $newname)
{

    $ch = curl_init($image);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    $rawdata=curl_exec ($ch);
    curl_close ($ch);
    $fp = fopen("$newname.jpg",'w');
    fwrite($fp, $rawdata); 
    fclose($fp);
}

但问题是,我得到了所有图像,只有最后一张是可见的。其他我无法打开,它们只有 1KB

那么我做错了什么?

另外我还需要稍后下载 png-Files,所以我可以将 $newname.jpg 更改为 $newname.png 吗?

提前谢谢,我真的需要一个快速的答案,在这里坐了好几个小时,想弄清楚。

【问题讨论】:

  • 你在 $arr 里面有什么?
  • $j 的起始值是多少?
  • $j 可能从 null 开始,这在挪威语中表示 0。 :)
  • 这只是一个sn-p。 $j 当然从 0 开始。 $arr 是文件中的 url。他们是真的,我附和他们,他们很好,所以没有问题。
  • @OIS 这不是 100% 正确的,但在这种情况下你是对的 ;)

标签: php image curl


【解决方案1】:

为什么不使用stream_copy_to_stream

function getImage($image, $newname, $fileType = "jpg")
{
    $in = fopen($image, "r");
    $out = fopen("$newname.$fileType",'w');
    stream_copy_to_stream($in, $out); 
    fclose($in); fclose($out);
}

你也可以玩stream_set_read_buffer

stream_set_read_buffer($in, 4096);

刚刚使用我们的头像图片对此进行了测试。

$data = [
    "https://www.gravatar.com/avatar/42eec337b6404f97aedfb4f39d4991f2?s=32&d=identicon&r=PG&f=1",
    "https://www.gravatar.com/avatar/2700a034dcbecff07c55d4fef09d110b?s=32&d=identicon&r=PG&f=1",
];

foreach ($data as $i => $image) getImage($image, $i, "png");

完美运行。

调试:阅读远程标头以获取更多信息? $httpresponseheader

var_dump($http_response_header);

stream_get_meta_data

var_dump(stream_get_meta_data($in), stream_get_meta_data($out));

【讨论】:

  • 谢谢,我以前试过,现在又试了。当我这样做时,我收到以下错误:警告:fopen(IMAGEURL):打开流失败:HTTP 请求失败! HTTP/1.1 403 Forbidden in C:\xampp\htdocs\Imagescale\functions.php 在第 93 行我编辑了警告消息,我用 fopen() 中的 IMAGEURL 替换了图像中的 url
  • 您可以在不登录任何地方的情况下在隐身浏览器窗口中打开图像吗?你能用 cli curl 得到它吗?你的PHP可以下载外部文件吗?
  • Icognito 浏览器有效。正如我之前所说,使用 curl 我可以得到一张图像,这是最后一张。与其他人一起,我得到了新文件,但它们无法正常工作,而且只有 1kb 大。
  • @DerrickRose 403 来自远程服务器。也许您的 URL 需要正确编码。 %20 表示空格等。浏览器中显示的 url 是否与输入数据中的相同?也许你可以检查一下1kb大文件的内容是不是403 html页面?
  • 是的,它们保持不变,没有特殊字符,除了“_”,但我认为这不是问题。
猜你喜欢
  • 2014-10-27
  • 2022-09-30
  • 1970-01-01
  • 2017-06-12
  • 2015-10-01
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多