在 PHP 中从 URL 保存图像
本文介绍了在 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.";
}
?>
输出结果如下:
使用 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";
}
?>
输出结果:
使用 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 中使用 fread() 和 fwrite() 从 URL 保存图像
PHP fread()
将读取打开的文件,而 fwrite()
将写入打开的文件。 知道了这一点,你可以使用 fopen()
打开图像 URL,使用 fread()
读取图像,然后你可以使用 fwrite()
保存它。
这听起来比看起来要复杂一些。 这就是为什么我们创建了一个函数来简化流程。
该功能以下列方式工作:
-
使用
fopen()
以读取二进制模式打开图像。 -
使用
fopen()
在写入二进制模式下打开图像位置。 -
使用
fread()
读取图像。 - 将图像写入图像位置。
- 关闭打开的图像的句柄。
- 关闭图像位置的句柄。
我们已经使用此功能来保存 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 中保存 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";
}
?>
输出结果如下:
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341