PHP 保存图片到本地的两种常用方法

发布于 2026-06-16 09:11:26 / 153人查看

方法 1:使用 file_get_contents(简单场景)

<?php
$imageUrl = 'http://106.54.214.101:8188/appraisal_cloud/tools/getImg.do?url=MTc2ODE4MDkyMzc4M1w0NjMyLmpwZw==';
$savePath = __DIR__ . '/saved_image.jpg'; // 本地保存路径

// 尝试获取图片内容
$imageData = @file_get_contents($imageUrl);
if ($imageData !== false) {
    // 写入文件
    $result = file_put_contents($savePath, $imageData);
    if ($result !== false) {
        echo "图片保存成功!路径:{$savePath}";
    } else {
        echo "保存失败:无法写入文件";
    }
} else {
    echo "获取图片失败:请检查 URL 是否有效或服务器是否允许远程访问";
}
?>

方法 2:使用 cURL(更稳定,支持复杂请求)

<?php
function saveImageByCurl($url, $savePath) {
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_BINARYTRANSFER => true,
        CURLOPT_CONNECTTIMEOUT => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_FOLLOWLOCATION => true, // 跟随重定向
        CURLOPT_MAXREDIRS => 5,
        CURLOPT_SSL_VERIFYPEER => false, // 非 HTTPS 可关闭验证
        CURLOPT_SSL_VERIFYHOST => false
    ]);

    $imageData = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    if (curl_errno($ch) || $httpCode != 200) {
        curl_close($ch);
        return false;
    }
    
    curl_close($ch);
    
    // 创建目录(如果不存在)
    $dir = dirname($savePath);
    if (!is_dir($dir)) {
        mkdir($dir, 0777, true);
    }
    
    return file_put_contents($savePath, $imageData) !== false;
}

// 使用示例
$imageUrl = 'http://106.54.214.101:8188/appraisal_cloud/tools/getImg.do?url=MTc2ODE4MDkyMzc4M1w0NjMyLmpwZw==';
$savePath = __DIR__ . '/images/' . basename(parse_url($imageUrl, PHP_URL_PATH));

if (saveImageByCurl($imageUrl, $savePath)) {
    echo "图片已保存至:{$savePath}";
} else {
    echo "保存失败,可能原因:URL 无效、服务器拦截或图片不存在";
}
?>

注意事项

  1. 链接有效性:若链接需登录/鉴权,需在代码中添加 Cookie 或 Header(如 CURLOPT_COOKIECURLOPT_HTTPHEADER)。

  2. 服务器配置

    • 确保 PHP 开启 allow_url_fopen(方法1需要)。

    • 安装 cURL 扩展(方法2推荐)。

  3. 文件路径:保存目录需有 写入权限(Linux 服务器可执行 chmod 755 目录名)。

  4. 错误处理:建议添加日志记录(如 error_log),便于排查失败原因。