使用变量保存来自 url 的图像
Posted
技术标签:
【中文标题】使用变量保存来自 url 的图像【英文标题】:Save images from url with variable 【发布时间】:2016-03-09 05:16:20 【问题描述】:在你的帮助下,许多 *** 帖子,解决方案在这篇帖子的底部作为更新。
我正在尝试使用此代码在 php 文件中自动保存一些图像:
for ($num1=100;$num1<999;$num1++)
for ($num2=100;$num2<999;$num2++)
$postURL = "http://link_00000'.$num1.'_'.$num2.'.jpg";
$ch = curl_init('http://link_00000'.$num1.'_'.$num2.'.jpg');
$fp = fopen($postURL, '/path/Apolo/img/'.$num1.'_'.$num2.'.jpg', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);
第一个问题:
$num1
和 $num2
应该从 000 到 999 而不是从 0 到 999 开始。放置更多 $num
变量($num3
,$num4
...)将是一个解决方案,但我认为有一个更好的数字。
第二个问题:
图像未保存。我也试过这个,但没有用:
copy($postURL, '/path/img/'.$num1.'_'.$num2.'.jpg');
第三个问题:
如何防止像 d-dos 攻击这样的行为?如果我没有延迟加载链接,网站可能会关闭。
更新:
for ($num1=000;$num1<999;$num1++)
for ($num2=000;$num2<999;$num2++)
$url = 'http://link.com/00000'.sprintf("%03d", $num1).'_'.sprintf("%03d", $num2).'.jpg';
echo ''.$num1.'_'.$num2.'';
echo "\n";
if (@getimagesize($url)) \\ checks if url-image exists
echo $url;
$ch = curl_init($url);
$fp = fopen('/path/Apolo/00000'.sprintf("%03d", $num1).'_'.sprintf("%03d", $num2).'.jpg', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);
sleep(1); //1 second delay to avoid d-dos
【问题讨论】:
看看如何处理for循环的例子:php.net/manual/en/control-structures.for.php 您错误地连接了$postURL
值中的变量。尝试使用单引号作为字符串分隔符而不是双引号。
为什么您最终使用了包含大量 for 循环和数字的解决方案,而不是仅使用自动添加前导零的 sprintf("%03d", $num1)
。
【参考方案1】:
当你处理整数时,你不能说 000,因为它等于 0,如果你想让它写 000,那么你应该使用字符串来代替。
在您的示例中,您正在循环遍历数字,因此如果您不想循环,将其写为字符串会很麻烦。
因此,最好的解决方案是自己添加前导 0,可以这样做:sprintf("%03d", $num1);
这将自动添加您想要的前导零。
更新1:(忘记回答保存图片)
要保存图像,您可以这样做:file_put_contents('/path/Apolo/img/filename'.sprintf("%03d", $num1).'_'.sprintf("%03d", $num2).'.jpg', file_get_contents($postURL));
更新 2:(代码示例):
for ($num1=100;$num1<999;$num1++)
for ($num2=100;$num2<999;$num2++)
$postURL = 'http://link_00000'.sprintf("%03d", $num1).'_'.sprintf("%03d", $num2).'.jpg';
$path = '/path/Apolo/img/filename'.sprintf("%03d", $num1).'_'.sprintf("%03d", $num2).'.jpg';
file_put_contents($path, file_get_contents($postURL));
问题 3:
有很多方法可以防止 DDOS 攻击,但如果您只是不想让您的网站快速运行并防止/处理 DDOS 攻击,那么将您的 DNS 更改为 cloudflare,这是值得的,而且他们的免费帐户已经足够你。
【讨论】:
当我不使用变量时,我可以用我的代码保存图像。另外,我之前使用的是带有 (@getimagesize($url)) 的 IF。这个不工作。我必须先加载库吗? getimagesize 需要有一个完整的 url,包括“http://”。有了这个就可以了。 对不起,我在file_put_contents
中写错了,我忘了添加完整的文件名。刚刚更新了我的帖子
@ApoloRadomer:你也需要图片的尺寸吗?
现在可以使用了。我使用 imagesize 来检查图像是否存在。所以,我不会在我保存的文件夹中有哑巴。我也在使用 sleep(1) 来避免“d-dos”攻击。以上是关于使用变量保存来自 url 的图像的主要内容,如果未能解决你的问题,请参考以下文章
如何在不保存原始图像的情况下保存图像 URL 的裁剪图像? (在 Rails 中使用 Paperclip 或其他插件)
Crystal Report通过变量传递图像URL时未显示动态图像