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

Laravel上传图片至Firestore Storage遇401无效凭证错误求助

Laravel上传Firebase Storage报401 Invalid Credentials问题解决

问题分析

你遇到的401错误是认证凭据无效导致的,同时代码里还有两处细节错误需要修正:

代码中的明显错误

  • $objectName = $request->file('banner'); 这里直接将上传文件对象赋值给文件名变量,应该取文件原始名称或自定义文件名,比如 $objectName = $request->file('banner')->getClientOriginalName();
  • public_path('/public/firebase-temp-uploads') 路径冗余,public_path() 本身已指向项目public目录,应改为 public_path('firebase-temp-uploads'),否则会生成public/public/...的错误路径

核心解决步骤:配置Firebase认证凭据

  1. 登录Firebase控制台,进入项目设置→服务账号→点击「生成新的私钥」,下载JSON格式的服务账号密钥文件
  2. 将JSON文件放到Laravel项目根目录,命名为firebase-service-account.json(记得添加到.gitignore避免提交到版本库)
  3. 初始化StorageClient时指定凭据路径,或设置环境变量GOOGLE_APPLICATION_CREDENTIALS指向该文件路径

修正后的完整代码

$bucketName = 'my-bucket';
// 正确获取上传文件的原始名称
$objectName = $request->file('banner')->getClientOriginalName();
// 修正临时存储路径,确保目录存在
$tempDir = public_path('firebase-temp-uploads');
if (!file_exists($tempDir)) {
    mkdir($tempDir, 0755, true);
}
$source = $request->file('banner')->move($tempDir);

// 初始化StorageClient时传入认证凭据
$storage = new StorageClient([
    'keyFilePath' => base_path('firebase-service-account.json')
]);

$file = fopen($source, 'r');
$bucket = $storage->bucket($bucketName);
$object = $bucket->upload($file, [
    'name' => $objectName
]);

printf('Uploaded %s to gs://%s/%s' . PHP_EOL, basename($source), $bucketName, $objectName);

// 可选:上传完成后删除临时文件
unlink($source);

额外注意事项

  • 检查Firebase存储桶规则:在Firebase控制台存储页面的「规则」标签,确保服务账号拥有上传权限,例如设置allow write: if request.auth != null;(可根据业务需求调整)

内容的提问来源于stack exchange,提问作者KgosiE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:36:27