Laravel-Excel每次生成文件后权限重置,无法写入临时目录
Laravel-Excel临时目录权限问题解决方案
问题描述
使用Laravel-Excel生成文件时,无法写入临时目录/storage/framework/export/,报错:
ErrorException: fopen(/storage/framework/export/laravel-excel-CgOSec4XiXr3vry7juut47IAyVDV9eiB.csv): Failed to open stream: Permission denied in /vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/BaseWriter.php:128
手动修改目录权限后仅能正常运行一次,再次操作仍触发权限拒绝,推测是Laravel-Excel生成文件时主动修改了权限。
解决方案
1. 修复临时目录的基础权限
- 先确保临时目录存在,不存在则创建:
mkdir -p storage/framework/export - 设置目录归属为Web服务器用户(如
www-data或nginx)与本地用户同组,同时赋予读写权限:chown -R $USER:www-data storage/framework/export chmod -R 775 storage/framework/export - 执行Laravel存储链接命令(若未执行过):
php artisan storage:link
2. 配置Laravel-Excel的权限规则
在项目根目录的config/excel.php配置文件中,找到temporary_files节点,明确设置文件和目录的权限值,避免框架自动修改为不合理权限:
'temporary_files' => [ 'disk' => null, 'path' => null, 'prefix' => 'laravel-excel-', 'suffix' => '', 'file_permissions' => 0664, // 文件权限,确保同组可读写 'directory_permissions' => 0775, // 目录权限,确保同组可读写执行 ],
修改后保存配置,无需重启服务即可生效。
3. 确认PHP进程用户权限
- 查看当前运行PHP的用户(CLI模式为当前登录用户,FPM/WEB模式通常为
www-data):ps aux | grep php - 确保该用户对
storage/framework/export目录拥有读写权限;若使用队列执行导出任务,队列进程的用户也需具备相同权限。
4. 临时规避(不推荐修改依赖文件)
若上述方案无效,可临时修改PhpSpreadsheet的权限逻辑,但此修改会被Composer更新覆盖,仅作应急:
打开vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/BaseWriter.php,找到setFilePermissions方法,注释掉权限设置代码,或替换为需要的权限值。
内容的提问来源于stack exchange,提问作者Vijay
相关产品推荐
相关产品推荐

