使用PhpSpreadsheet从URL加载.xlsx文件报错:文件不存在
解决PhpSpreadsheet加载远程XLSX文件报错的问题
嘿,我来帮你搞定这个报错!你遇到的问题本质是PhpSpreadsheet的load()方法不支持直接加载远程HTTP/HTTPS URL——它默认只会去本地文件系统找路径,所以你把远程URL传进去,它就会把这个URL当成本地文件路径去搜,自然找不到,就报“File does not exist”了。
下面给你两个可行的解决方案:
方案1:先把远程文件下载到本地临时文件
先把远程的XLSX文件下载到服务器的临时目录,再加载这个本地文件,代码示例如下:
$remoteUrl = "http://localhost/test/csvfile/samplesms.xlsx"; // 创建临时文件存放下载的内容 $tempFile = tempnam(sys_get_temp_dir(), 'xlsx_temp_'); file_put_contents($tempFile, file_get_contents($remoteUrl)); // 加载本地临时文件 $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx'); $reader->setReadDataOnly(TRUE); $spreadsheet = $reader->load($tempFile); // 处理完业务逻辑后,记得删除临时文件释放空间 unlink($tempFile);
方案2:用内存流加载(不生成本地文件)
如果不想在服务器上生成临时文件,可以把远程文件内容读到内存流里,再让PhpSpreadsheet加载这个流:
$remoteUrl = "http://localhost/test/csvfile/samplesms.xlsx"; // 读取远程文件内容 $fileContent = file_get_contents($remoteUrl); // 创建内存读写流 $stream = fopen('php://memory', 'r+'); fwrite($stream, $fileContent); rewind($stream); // 把指针移到流开头 // 加载内存中的文件 $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx'); $reader->setReadDataOnly(TRUE); $spreadsheet = $reader->load($stream); // 用完流记得关闭 fclose($stream);
小提醒
- 要确保你的PHP配置里
allow_url_fopen是开启的,不然file_get_contents没法读取远程文件;如果这个配置没法改,你可以用cURL来替代file_get_contents完成下载。 - 用临时文件的话,一定要记得处理完后删除,不然时间久了会占满服务器磁盘空间哦。
内容的提问来源于stack exchange,提问作者sagar more
相关产品推荐
相关产品推荐

