如何用PHP的Curl读取XLSX文件?下载二进制文件返回0字节
问题排查与解决方案
你的问题大概率是服务器对请求的User-Agent做了限制,或是需要自动跟随重定向导致的。文本文件能正常下载,二进制文件却返回0字节,本质是这类资源的服务器会做额外访问校验。
修复步骤
模拟浏览器User-Agent
很多服务器会拒绝Curl默认的请求标识,设置一个常见的浏览器UA即可绕过拦截。开启自动跟随重定向
部分资源URL会先跳转到真实地址,Curl默认不处理重定向,需手动开启该选项。添加错误检测逻辑
原代码缺少错误捕获,无法定位具体问题,建议加上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
相关产品推荐
相关产品推荐

