PHP中的批量下载URL


Batch download URLs in PHP?

因此,我有一个PHP脚本,它应该下载用户输入的图像。但是,如果用户上传了一个TXT文件,并且其中包含到图像的直接链接,则应该从文件中的所有URL下载图像。我的脚本似乎正在运行,尽管似乎只有最后一个文件被下载,而其他文件则被存储为不包含数据的文件。

以下是我的脚本中解析TXT 的部分

$contents = file($file_tmp);
$parts = new SplFileObject($file_tmp);
foreach($parts as $line) {
   $url = $line;
   $dir = "{$save_loc}".basename($url);
   $fp = fopen ($destination, 'w+');
   $raw = file_get_contents($url);
   file_put_contents($dir, $raw);
}

如何让它从TXT文件下载每个URL?

SplFileObject上迭代时,会得到整行,包括空白。因此,您的URL将类似

http://example.com/_

(php似乎把换行符改成了下划线),因此许多URL都会出现错误(有些URL仍然可以正常工作,因为它们包含了之前的重要信息。例如,php中的批量下载URL?可以工作,但https://stackoverflow.com/_没有)。如果发生错误,file_get_contents将返回false,而file_put_contents将把它解释为空字符串。

此外,$fp = fopen ($destination, 'w+');这条线真的很奇怪。首先,由于没有定义$destination,它无论如何都会出错。即使定义了$destination,您也会得到大量的文件句柄,并多次覆盖那个糟糕的文件。你可以直接删除它。

总之,您的代码应该看起来像

<?php
$file_tmp = "urls.txt";
$save_loc = "sav/";
$parts = new SplFileObject($file_tmp);
foreach($parts as $line) {
    $url = trim($line);
    if (!$url) {
        continue;
    }
    $dir = "{$save_loc}".basename($url);
    $raw = file_get_contents($url);
    if ($raw === false) {
        echo 'failed to donwload ' . $url . "'n";
        continue;
    }
    file_put_contents($dir, $raw);
}

它看起来像线

$parts = new SplFileObject($file_tmp);

没有那么必要

$fp = fopen ($destination, 'w+');

file()函数将整个文件读入数组。您只需要对每个数组元素调用trim()就可以从字符中删除新行。以下代码应正常工作:

<?php
$save_loc = './';
$urls = file('input.txt');
foreach($urls as $url) {
  $url = trim($url);
  $destination = $save_loc . basename($url);
  $content = file_get_contents($url);
  if ($content) {
    file_put_contents($destination, $content);
  }
}