You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP的Curl读取XLSX文件?下载二进制文件返回0字节

问题排查与解决方案

你的问题大概率是服务器对请求的User-Agent做了限制,或是需要自动跟随重定向导致的。文本文件能正常下载,二进制文件却返回0字节,本质是这类资源的服务器会做额外访问校验。

修复步骤

  1. 模拟浏览器User-Agent
    很多服务器会拒绝Curl默认的请求标识,设置一个常见的浏览器UA即可绕过拦截。

  2. 开启自动跟随重定向
    部分资源URL会先跳转到真实地址,Curl默认不处理重定向,需手动开启该选项。

  3. 添加错误检测逻辑
    原代码缺少错误捕获,无法定位具体问题,建议加上Curl错误信息和HTTP状态码的排查代码。

修改后的完整代码

$sourceURL = 'https://www.gencon.com/downloads/events.xlsx';
$targetFilename = 'GenConEvents.xlsx';

if (file_exists($targetFilename)) {
    unlink($targetFilename);
}

$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_URL, $sourceURL);
// 模拟浏览器请求标识
curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36');
// 自动跟随重定向
curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
// 临时禁用SSL证书校验(生产环境建议配置合法CA证书后开启)
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);

$contents = curl_exec($c);

// 错误排查逻辑
if(curl_errno($c)) {
    echo 'Curl错误:' . curl_error($c) . PHP_EOL;
} else {
    $httpCode = curl_getinfo($c, CURLINFO_HTTP_CODE);
    echo 'HTTP状态码:' . $httpCode . PHP_EOL;
    echo "File returned " . strlen($contents) . " bytes\n\n";

    if (file_put_contents($targetFilename, $contents) === false) {
        echo "Error downloading the spreadsheet\n\n";
    } else {
        echo "文件下载成功\n";
    }
}

curl_close($c);

额外说明

  • CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST设为false是临时调试方案,生产环境建议配置正确的CA证书路径以开启SSL校验,避免安全风险。
  • 若问题仍存在,可通过curl_getinfo()查看请求的详细响应头、最终跳转URL等信息,进一步定位服务器限制规则。

内容的提问来源于stack exchange,提问作者Don Del Grande

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 21:09:50