Laravel文件上传服务器报错:文件不存在或不可读,本地正常如何解决?
Laravel 文件上传线上服务器报错:"The "" file does not exist or is not readable." 解决办法
可能原因及对应解决方案
1. 服务器存储目录权限问题
线上服务器的storage/app/public/uploads目录可能缺少读写权限,导致文件无法正常写入。
- 执行权限配置命令(根据服务器运行用户调整,以下为Apache/Nginx通用示例):
chmod -R 755 storage/ chown -R www-data:www-data storage/
2. 存储磁盘配置与软链接问题
检查config/filesystems.php中public磁盘的配置是否正确:
'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ],
- 配置完成后,创建存储目录到公共目录的软链接:
若线上无法执行Artisan命令,可手动创建软链接:php artisan storage:linkln -s /你的项目路径/storage/app/public /你的项目路径/public/storage
3. 上传代码规范优化
原代码存在冗余且未做文件有效性校验,建议修改为更规范的写法:
$file = $request->file('file'); // 先校验文件是否有效 if (!$file || !$file->isValid()) { abort(400, '上传文件无效'); } $fileName = time() . '_' . $file->getClientOriginalName(); // 使用storeAs方法简化存储逻辑 $path = $file->storeAs('public/uploads', $fileName); // 生成正确的访问URL $url = Storage::url(str_replace('public/', '', $path)); $fileModel = new File; $fileModel->name = $fileName; $fileModel->file_path = $url; $fileModel->save();
4. PHP上传大小限制
线上服务器的PHP配置可能限制了上传文件的大小,导致文件未完整上传就被截断。
- 修改
php.ini中的相关配置:
修改后重启Apache/Nginx及PHP服务。upload_max_filesize = 64M post_max_size = 64M max_execution_time = 300
5. 请求参数与表单验证
确保前端表单提交时设置了enctype="multipart/form-data"属性,且请求中包含名为file的上传字段。同时在控制器中增加验证:
$request->validate([ 'file' => 'required|file', ]);
内容的提问来源于stack exchange,提问作者Saeed Mi
相关产品推荐
相关产品推荐

