php curl远程下载文件保存到本地服务器的指定目录

项目场景:

PHP实现远程下载文件到本地


方法描述

保存到服务器中

``/**
 * @param $url 下载链接:https://img.pconline.com.cn/images/upload/upc/tx/itbbs/2101/25/c1/251135935_1611532823091_mthumb.jpg
 * @param $directory  文件保存目录:E:/phpstudy_pro/WWW/prj/tp5test/public/img/
 * @return string
 */
function downloadFileSimplified($url, $directory)
{
    // 提取并转换文件名
    $fileName = basename($url);
    $safeFileName = iconv("UTF-8", "GB2312//IGNORE", urldecode($fileName));
    $filePath = rtrim($directory, '/') . DIRECTORY_SEPARATOR . $safeFileName;

    $file = @fopen($filePath, 'w+');
    if (!$file) {
        return "Error:无法创建文件。";
    }

    // 初始化cURL
    $ch = curl_init($url);
    if (!$ch) {
        fclose($file);
        return "Error:无法初始化cURL。";
    }

    // 设置cURL选项
    curl_setopt_array($ch, [
        CURLOPT_FILE => $file,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_SSL_VERIFYPEER => false, // 生产环境中建议开启
        CURLOPT_SSL_VERIFYHOST => false, // 生产环境中建议开启
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_TIMEOUT => 30,
    ]);

    // 执行请求并检查结果
    $success = curl_exec($ch);
    $error = curl_error($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    // 清理资源
    curl_close($ch);
    // 关闭文件
    fclose($file);

    // 根据执行结果处理
    if ($success === false) {
        unlink($filePath); // 删除可能已部分写入的文件
        return "Error:" . $error;
    }
    if ($httpCode !== 200) {
        unlink($filePath);
        return "Error:下载失败,HTTP状态码为 $httpCode";
    }

    return "文件下载成功:" . $filePath;
}

//使用示例
// 定义下载的URL
$url = "https://example.com/path/to/your/file.csv";

// 指定保存文件的本地目录
$saveDirectory = "/path/to/your/local/directory/";

// 调用下载函数
$resultMessage = downloadFileSimplified($url, $saveDirectory);

// 根据函数返回的消息输出结果
if (strpos($resultMessage, "Error") !== false) {
    echo "下载失败: " . $resultMessage;
} else {
    echo $resultMessage;
}`

---

第二种方法

/**
 * @param $url  远程地址:"http://www.baidu.com/img/baidu_jgylogo3.gif"
 * @param $path 本地保存目录:/www/wwwroot/dow/
 * @return bool
 */
function download_file($url, $path)
{
    // 检查路径是否存在,如果不存在则创建
    if (!file_exists($path)) {
        mkdir($path, 0777, true);
    }

    // 解码URL中的文件名
    $decoded_file = urldecode(basename($url));

    // 拼接文件路径
    $file_path = rtrim($path, '/') . '/' . mb_convert_encoding($decoded_file, "GB2312", "UTF-8"); // 使用rtrim确保没有尾随斜杠


    $file = @fopen($file_path, 'w+');

    // 初始化 curl 会话
    $ch = curl_init();

    // 设置要请求的 URL
    curl_setopt($ch, CURLOPT_URL, $url);

    // 设置输出文件流
    curl_setopt($ch, CURLOPT_FILE, $file);

    // 设置请求超时时间(单位:秒)
    curl_setopt($ch, CURLOPT_TIMEOUT, 40);

    // 启用SSL验证并忽略自签名证书警告(生产环境应使用CA证书验证)
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    // 开启重定向跟踪功能
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

    // 执行 curl 请求
    $result = curl_exec($ch);

    // 获取 HTTP 状态码
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    // 关闭文件和 curl 会话
    curl_close($ch);

    fclose($file);

    // 如果请求失败或HTTP状态码不是200,删除该文件并返回false
    if ($result === false || $httpcode !== 200) {
        unlink($file_path);
        return false;
    }

    // 返回true表示下载成功
    return true;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果在 PHP 和 Nginx 中下载远程图片时出现不完整的问题,可以尝试以下解决方法: 1. 增加 PHP 的执行时间限制:在 PHP 的配置文件php.ini)中增加或修改 `max_execution_time` 的值,将其设置为更大的数值,以确保下载时间不会超过限制。 2. 增加 Nginx 的超时时间:在 Nginx 的配置文件中,增加或修改 `proxy_read_timeout` 的值,将其设置为更大的数值,以允许更长的时间来获取远程图片。 3. 使用 cURL 函数进行下载:使用 PHPcURL 函数来进行远程图片下载可以提供更多的控制和错误处理。以下是一个使用 cURL 下载保存图片的示例代码: ```php $imageUrl = 'http://example.com/path/to/image.jpg'; $savePath = 'path/to/save/image.jpg'; $ch = curl_init(); $fp = fopen($savePath, 'wb'); curl_setopt($ch, CURLOPT_URL, $imageUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_FILE, $fp); $imageData = curl_exec($ch); curl_close($ch); fclose($fp); ``` 在这个示例中,我们使用 cURL 函数来从远程 URL 获取图片数据,并将其保存指定路径。通过设置 `CURLOPT_CONNECTTIMEOUT`,我们可以指定连接超时时间。 4. 检查远程服务器的稳定性:如果仍然无法完整下载远程图片,可能是远程服务器的问题。可以尝试使用其他工具或浏览器来访问远程图片,检查是否能够完整显示。 通过以上方法,你可以尝试解决 PHP 和 Nginx 中远程图片下载不完整的问题。根据具体情况,你可以选择适合你的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值