c语言编程笔录

首页 >   > 笔记大全

笔记大全

用 PHP 实现下载网络上的所有图片

更新时间:2023-11-08

第一段:需求分析

要用 PHP 实现下载网络上的所有图片,我们需要先明确一些需求和功能。首先,我们需要能够从一个 URL 中提取出所有的图片链接。其次,我们需要遍历这些链接,对每个链接执行下载操作。最后,我们需要确保下载到的图片能够保存到本地,并且可以指定一个目录来存储这些图片。

function extractImageLinksFromUrl($url) {

    // 获取 URL 页面内容,使用 file_get_contents 函数
    $pageContent = file_get_contents($url);

    // 匹配 HTML 页面中的所有  标签,使用 preg_match_all 函数
    preg_match_all('/]+>/i', $pageContent, $images);

    // 匹配  标签中的 src 属性,使用正则表达式
    preg_match_all('/src=("[^"]*")/', implode($images[0]), $srcs);

    // 返回所有图片链接
    return $srcs[1];
}

第二段:实现方法

有了提取图片链接的函数之后,我们就可以开始实现下载图片的功能了。我们需要编写一个函数,这个函数接受一个 URL 和一个目录作为参数,然后下载所有的图片到指定的目录中。

function downloadImagesFromUrl($url, $dir) {

    // 提取页面中的图片链接
    $imageLinks = extractImageLinksFromUrl($url);

    // 遍历所有链接,下载图片到本地目录
    foreach ($imageLinks as $link) {
        $filename = basename($link); // 提取图片文件名
        $filepath = $dir . '/' . $filename; // 拼接文件路径

        // 下载图片到本地
        file_put_contents($filepath, file_get_contents($link));
    }
}

第三段:异常处理

我们已经完成了基本的下载代码,但是这段代码中存在一些安全隐患和异常情况。例如,文件名可能包含非法字符,图片链接可能失效或者下载失败等等。因此,我们需要进行一些异常处理来增加代码的健壮性。

function downloadImagesFromUrl($url, $dir) {

    // 提取页面中的图片链接
    $imageLinks = extractImageLinksFromUrl($url);

    // 遍历所有链接,下载图片到本地目录
    foreach ($imageLinks as $link) {
        // 提取图片文件名
        $filename = basename($link);
        // 拼接文件路径
        $filepath = $dir . '/' . $filename;

        try {
            // 下载图片到本地
            $imageContent = @file_get_contents($link);

            if ($imageContent === false) { // 图片链接无效
                throw new Exception('Invalid image link: ' . $link);
            }

            if (file_put_contents($filepath, $imageContent) === false) { // 下载失败
                throw new Exception('Failed to download image: ' . $link);
            }
        } catch (Exception $e) {
            echo $e->getMessage() . "\n"; // 输出错误信息
        }
    }
}

第四段:完整代码

最后,我们将提取图片链接和下载图片的代码组合在一起,并添加一些额外的异常处理,将其做成一个完整的 PHP 函数。

function downloadImagesFromUrl($url, $dir) {

    // 提取页面中的图片链接
    $imageLinks = extractImageLinksFromUrl($url);

    // 遍历所有链接,下载图片到本地目录
    foreach ($imageLinks as $link) {
        // 提取图片文件名
        $filename = basename($link);
        // 对文件名进行过滤,防止非法字符
        $filename = filter_var($filename, FILTER_SANITIZE_URL);
        // 拼接文件路径
        $filepath = $dir . '/' . $filename;

        try {
            // 下载图片到本地
            $imageContent = @file_get_contents($link);

            if ($imageContent === false) { // 图片链接无效
                throw new Exception('Invalid image link: ' . $link);
            }

            if (file_put_contents($filepath, $imageContent) === false) { // 下载失败
                throw new Exception('Failed to download image: ' . $link);
            }
        } catch (Exception $e) {
            echo $e->getMessage() . "\n"; // 输出错误信息
        }
    }
}

function extractImageLinksFromUrl($url) {

    // 获取 URL 页面内容,使用 file_get_contents 函数
    $pageContent = file_get_contents($url);

    // 匹配 HTML 页面中的所有  标签,使用 preg_match_all 函数
    preg_match_all('/]+>/i', $pageContent, $images);

    // 匹配  标签中的 src 属性,使用正则表达式
    preg_match_all('/src=("[^"]*")/', implode($images[0]), $srcs);

    // 返回所有图片链接
    return $srcs[1];
}

$url = ''; // 输入你需要下载图片的 URL
$dir = ''; // 输入下载图片保存的目录

downloadImagesFromUrl($url, $dir);