因此,我有一个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);
}
}