迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > PHP >

在 PHP 中从 URL 保存图像

作者:迹忆客 最近更新:2023/03/28 浏览次数:

本文介绍了在 PHP 中从 URL 保存图像的五种方法。 这些方法将使用 file_put_contents()、copy()、fopen()、fread()、fwrite() 和 gzdecode() 等函数。


在 PHP 中使用 file_get_contents() 和 file_put_contents() 从 URL 保存图像

PHP file_get_contents() 会将文件读入字符串,而 file_put_contents() 可以将该字符串写入文件。 结合这两个功能可以让您从 URL 保存图像。

首先,使用 file_get_contents() 将 URL 中的图像转换为字符串,然后使用 file_put_contents() 将此字符串保存到文件中。 结果将是 URL 中图像的副本。

在下文中,我们使用 file_get_contents()file_put_contents() 从 Imgur 保存图像。 此外,我们将图像重命名为 01_computer_image.png,但您可以使用其他名称和有效的图像扩展名。

<?php
    // The image is from Unsplash, and we've uploaded
    // it to Imgur for this article.
    $image_url = 'https://i.imgur.com/NFyDQTj.jpeg';
    // Define the image location. Here, the location
    // is the saved_images folder.
    $image_location = 'saved_images/01_computer_image.png';
    // Use file_put_contents to grab the image from
    // the URL and place it into the image location
    // with its new name.
    if (file_put_contents($image_location, file_get_contents($image_url))) {
        echo "Image saved successfully";
    } else {
        echo "An error code, please check your code.";
    }
?>

输出结果如下:

使用 PHP file_put_contents 和 file_get_contents 从 URL 保存图像


使用 cURL 从 URL 保存图像

cURL 是使用网络协议传输数据的命令行工具。 由于图像存在于服务器的 URL 中,您可以启动 cURL 会话,将副本保存到您的计算机。

在下文中,我们有一个 cURL 会话,它将保存来自 Imgur URL 的图像。

<?php
    // Initiate a cURL request to the image, and
    // define its location.
    $curl_handler = curl_init('https://i.imgur.com/ZgpqSGm.jpeg');
    $image_location = 'saved_images/02_apples.png';
    // Open the file for writing in binary mode
    $open_image_in_binary = fopen($image_location, 'wb');
    // Define where cURL should save the image.
    curl_setopt($curl_handler, CURLOPT_FILE, $open_image_in_binary);
    curl_setopt($curl_handler, CURLOPT_HEADER, 0);
    // Lets you use this script when there is
    // redirect on the server.
    curl_setopt($curl_handler, CURLOPT_FOLLOWLOCATION, true);
    // Auto detect encoding for the response | identity
    // deflation and gzip
    curl_setopt($curl_handler, CURLOPT_ENCODING, '');
    // Execute the current cURL session.
    curl_exec($curl_handler);
    // Close the connection and
    curl_close($curl_handler);
    // Close the file pointer
    fclose($open_image_in_binary);

    // Confirm the  new image exists in the saved_images
    // folder.
    if (file_exists($image_location)) {
        echo "Image saved successfully";
    } else {
        echo "An error occurred. Please check your code";
    }
?>

输出结果:

使用 cURL 从 URL 保存图像


使用 PHP 中的 copy() 函数从 URL 保存图像

PHP copy() 函数可以将资源从一个位置复制到另一个位置。 要从 URL 保存图像,请为 copy() 提供 URL 和新位置。

为确保您拥有图像,请使用 file_exists() 检查其是否存在。

<?php
    $image_url = 'https://i.imgur.com/CcicAAl.jpeg';
    $image_location = 'saved_images/03_robot.png';
    // Use the copy() function to copy the image from
    // its Imgur URL to a new file name in the
    // saved_images folder.
    $copy_image = copy($image_url, $image_location);
    // Confirm the  new image exists in the saved_images
    // folder.
    if (file_exists($image_location)) {
        echo "Image saved successfully";
    } else {
        echo "An error occurred. Please check your code";
    }
?>

输出结果如下:

使用 PHP copy() 函数保存图像


在 PHP 中使用 fread() 和 fwrite() 从 URL 保存图像

PHP fread() 将读取打开的文件,而 fwrite() 将写入打开的文件。 知道了这一点,你可以使用 fopen() 打开图像 URL,使用 fread() 读取图像,然后你可以使用 fwrite() 保存它。

这听起来比看起来要复杂一些。 这就是为什么我们创建了一个函数来简化流程。

该功能以下列方式工作:

  1. 使用 fopen() 以读取二进制模式打开图像。
  2. 使用 fopen() 在写入二进制模式下打开图像位置。
  3. 使用 fread() 读取图像。
  4. 将图像写入图像位置。
  5. 关闭打开的图像的句柄。
  6. 关闭图像位置的句柄。

我们已经使用此功能来保存 Mac 的图片。

<?php
    // Define a custom function to grab an image
    // from a URL using fopen and fread.
    function save_image_from_URL($source, $destination) {
        $image_source = fopen($source, "rb");
        $image_location = fopen($destination, "wb");

        while ($read_file = fread($image_source, 8192)) {
            fwrite($image_location, $read_file, 8192);
        }
        fclose($image_source);
        fclose($image_location);
    }
    // Set the image URL and its new destination on
    // your system
    $image_url = 'https://i.imgur.com/XGSex5B.jpeg';
    $image_location = 'saved_images/04_Mac.png';
    // Save the image to its new destination
    $save_image = save_image_from_URL($image_url, $image_location);
    // Confirm the  new image exists in the saved_images
    // folder.
    if (file_exists($image_location)) {
        echo "Image saved successfully";
    } else {
        echo "An error occurred. Please check your code";
    }
?>

输出结果如下:

使用 PHP fread 和 fwrite 从 URL 保存图像


在 PHP 中保存 gzip 图像

如果图像采用 gzip 压缩,本文中讨论的方法可能不起作用。 作为解决方法,我们修改了第一个使用 file_put_contents()file_get_contents() 的示例。

这一次,我们获取图像标头并检查 gzip 编码。 如果为真,我们在保存之前解码图像; 否则,我们使用 PHP copy() 函数复制图像。

<?php
    // Set the image URL and its new location
    $image_url = 'https://i.imgur.com/PpJnfpL.jpeg';
    $image_location = 'saved_images/05_Application_UI.png';

    // Fetch all headers from the URL
    $image_headers = get_headers($image_url);

    // Check if content encoding is set
    $content_encoding = isset($image_headers['Content-Encoding']) ? $image_headers['Content-Encoding'] : null;

    // Set gzip decode flag
    $gzip_decode = ($content_encoding === 'gzip') ? true : false;

    // If the image is gzipped, decode it before
    // placing it in its folder.
    if ($gzip_decode) {
        file_put_contents($image_location, gzdecode(file_get_contents($image_url)));
    } else {
        copy($image_url, $image_location);
    }
    // Confirm the  new image exists in the saved_images
    // folder.
    if (file_exists($image_location)) {
        echo "Image saved successfully";
    } else {
        echo "An error occurred. Please check your code";
    }
?>

输出结果如下:

使用 Gzip 压缩保存图像

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 PHP 中获取时间差的分钟数

发布时间:2023/03/29 浏览次数:183 分类:PHP

本文介绍了如何在 PHP 中获取时间差的分钟数,包括 date_diff()函数和数学公式。它包括 date_diff()函数和数学公式。

PHP 中的重定向

发布时间:2023/03/29 浏览次数:136 分类:PHP

本教程演示了如何将用户从页面重定向到 PHP 中的其他页面

PHP 分页

发布时间:2023/03/29 浏览次数:66 分类:PHP

本教程介绍如何在 PHP 中对数据库行进行分页

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便