php实现图片下载
使用 file_get_contents 和 file_put_contents 下载图片
通过 file_get_contents 读取远程图片内容,再用 file_put_contents 保存到本地。适合小文件下载,简单直接。
$imageUrl = 'https://example.com/image.jpg';
$savePath = 'downloaded_image.jpg';
$imageData = file_get_contents($imageUrl);
if ($imageData !== false) {
file_put_contents($savePath, $imageData);
echo "图片下载成功";
} else {
echo "下载失败";
}
使用 cURL 下载图片
cURL 提供更灵活的选项,适合大文件或需要更多控制的场景。可设置超时、跟随重定向等参数。
$imageUrl = 'https://example.com/image.jpg';
$savePath = 'downloaded_image.jpg';
$ch = curl_init($imageUrl);
$fp = fopen($savePath, 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
curl_close($ch);
fclose($fp);
处理文件名和路径
动态生成保存路径,避免文件名冲突。从 URL 提取文件名或使用时间戳命名。

$imageUrl = 'https://example.com/image.jpg';
$filename = basename($imageUrl); // 或使用 uniqid() 生成唯一名
$savePath = 'downloads/' . $filename;
// 确保目录存在
if (!file_exists('downloads')) {
mkdir('downloads', 0777, true);
}
添加错误处理和验证
增加 HTTP 状态码检查,验证是否为图片类型,避免保存非图片内容。
$headers = get_headers($imageUrl, 1);
if (strpos($headers['Content-Type'], 'image/') === false) {
die("URL 不是有效的图片");
}
$httpCode = substr($headers[0], 9, 3);
if ($httpCode != 200) {
die("图片不可访问");
}
分块下载大文件
对于大文件,采用分块读写方式减少内存占用。

$source = fopen($imageUrl, 'rb');
$dest = fopen($savePath, 'wb');
while (!feof($source)) {
fwrite($dest, fread($source, 8192));
}
fclose($source);
fclose($dest);
用户代理和 Referer 设置
某些网站会验证请求头,需模拟浏览器访问。
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
curl_setopt($ch, CURLOPT_REFERER, 'https://example.com');
安全性注意事项
验证 URL 是否为真实图片地址,避免 SSRF 攻击。
$parsedUrl = parse_url($imageUrl);
if (!in_array($parsedUrl['host'], ['trusted-domain.com', 'cdn.example.net'])) {
die("不允许的域名");
}






