通过php将URL中的图像保存到表单中

通过php将URL中的图像保存到表单中,php,image,forms,url,save,Php,Image,Forms,Url,Save,我有一个php脚本,它从外部URL获取图像,读取图像并将其保存到服务器上的目录中。该脚本位于php文件中,包含: <?php $image_url = "http://example.com/image.jpg"; $ch = curl_init(); $timeout = 0; curl_setopt ($ch, CURLOPT_URL, $image_url); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); //

我有一个php脚本,它从外部URL获取图像,读取图像并将其保存到服务器上的目录中。该脚本位于php文件中,包含:

<?php 
$image_url = "http://example.com/image.jpg"; 
$ch = curl_init(); 
$timeout = 0; 
curl_setopt ($ch, CURLOPT_URL, $image_url); 
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 

// Getting binary data 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 

$image = curl_exec($ch); 
curl_close($ch); 

$f = fopen('/home1/path/public_html/path/saved/image.jpg', 'w');
fwrite($f, $image);
fclose($f);
?>

那里一切都很好

我想做的是让脚本为多个URL执行此操作。URL将写在一个表单textarea中,由comas(或else)分隔

提交按钮会告诉脚本对表单中的所有URL执行此操作,并使用任何名称保存它们,这并不重要(随机即可)

我还是个新手,我正在学习PHP

提前感谢您的帮助

编辑

我的代码现在看起来像这样:

<?php 
error_reporting(E_ALL);
$image_urls = explode('\n', $_POST['urls']); 



foreach ($image_urls as $image_url) {
$ch = curl_init(); 
$timeout = 0; 
curl_setopt ($ch, CURLOPT_URL, $image_url); 
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 

  $image = curl_exec($ch); 
  curl_close($ch); 

  $f = fopen('/home1/path/public_html/path/saved/'.rand().time().".jpg", 'w');
  fwrite($f, $image);
  fclose($f);

}
?>

它只对第一个有效,并且不返回任何错误。。。有什么想法吗


谢谢你的帮助

您需要从文本区域提取URL,然后在该区域上循环:

<?php 
$image_urls = explode('\n', $_POST['urls']); # Will create a list of urls, if each line contains one url.

#Basic settings and initializers need to be ran only once. 
$sequencer = 1;
$timeout = 0;

foreach ($image_urls as $image_url) {
  $ch = curl_init(); 

  curl_setopt ($ch, CURLOPT_URL, $image_url); 
  curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 

  // Getting binary data 
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 

  $image = curl_exec($ch); 
  curl_close($ch); 

  $f = fopen("/home1/path/public_html/path/saved/image_$sequencer.jpg", 'w');
  fwrite($f, $image);
  fclose($f);
  $sequencer++;
}
?>


显然,您应该清理、验证和双重检查输入的信息:不仅是为了避免山羊毛,也是为了避免打断应用程序的条目(如白线)。

您需要从文本区域提取URL,然后循环:

<?php 
$image_urls = explode('\n', $_POST['urls']); # Will create a list of urls, if each line contains one url.

#Basic settings and initializers need to be ran only once. 
$sequencer = 1;
$timeout = 0;

foreach ($image_urls as $image_url) {
  $ch = curl_init(); 

  curl_setopt ($ch, CURLOPT_URL, $image_url); 
  curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 

  // Getting binary data 
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 

  $image = curl_exec($ch); 
  curl_close($ch); 

  $f = fopen("/home1/path/public_html/path/saved/image_$sequencer.jpg", 'w');
  fwrite($f, $image);
  fclose($f);
  $sequencer++;
}
?>



显然,您应该清理、验证和双重检查输入的信息:不仅是为了避免山羊毛,也是为了避免破坏应用程序的条目(如白线)。

将单个URL存储在txt或db中?存储在文本区域中,按行分割……抱歉,我完全忽略了这个问题。不知何故,我以为你想通过cron作业获取这些图像。我可能想稍后再这样做,但现在我只想这样做。。。对我的问题有什么想法吗?你是说如何通过cron作业获取它们?将单个URL存储在txt或db中?将其存储在文本区域中,按行分割…抱歉,我完全忽略了这个问题。不知何故,我以为你想通过cron作业获取这些图像。我可能想稍后再这样做,但现在我只想这样做。。。对我的问题有什么想法吗?你是说如何通过cron作业获取它们?非常感谢你的快速回答!还有一件事,在HTML中,我应该将操作设置为“MYSCRIPT.php”,并将textarea命名为“URL”对吗?是的,method=“post”action=“MYSCRIPT.php”带有一个textarea“URL”请注意,任何人(也包括那些无法访问呈现textarea的代码的人)都可以发送带有URL列表的帖子。您可能希望在上述代码中首先检查访问权限。此外,请参阅Hassan的答案以了解进一步的改进:在函数中添加这样的保护程序可以使代码更好、可读性更好、可维护性更好、更不容易出现错误。因此,我尝试使用您的解决方案,当我将两个URL放在文本区域的不同行上时,会得到一个名为image_1.jpg的文件,其权重为0kb。就这样。知道我做错了什么吗?谢谢好的,现在它工作了,但是它只在第一个url上工作。。。想法?我更改了代码:关闭和打开curl资源时出错。对于未来:尝试调试和调查日志。日志会告诉你这里的问题。调试将向您显示问题发生的原因。在代码上撒一些
var\u dump()
。就像一个
var\u dump($image\u url)
在你创建之后,看看它是否是一个正确的URL列表(数组)。非常感谢你的快速回答!还有一件事,在HTML中,我应该将操作设置为“MYSCRIPT.php”,并将textarea命名为“URL”对吗?是的,method=“post”action=“MYSCRIPT.php”带有一个textarea“URL”请注意,任何人(也包括那些无法访问呈现textarea的代码的人)都可以发送带有URL列表的帖子。您可能希望在上述代码中首先检查访问权限。此外,请参阅Hassan的答案以了解进一步的改进:在函数中添加这样的保护程序可以使代码更好、可读性更好、可维护性更好、更不容易出现错误。因此,我尝试使用您的解决方案,当我将两个URL放在文本区域的不同行上时,会得到一个名为image_1.jpg的文件,其权重为0kb。就这样。知道我做错了什么吗?谢谢好的,现在它工作了,但是它只在第一个url上工作。。。想法?我更改了代码:关闭和打开curl资源时出错。对于未来:尝试调试和调查日志。日志会告诉你这里的问题。调试将向您显示问题发生的原因。在代码上撒一些
var\u dump()
。就像您创建了一个
var\u dump($image\u url)
之后,查看它是否是一个正确的URL列表(数组)。