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

如何解决Backblaze B2 S3兼容API文件上传错误?

Laravel上传Backblaze B2常见错误解决

错误1:The request body was too small

代码问题

你最初使用的上传代码:

Storage::disk('s3')->put('profile-photos', $photo);

如果$photo是表单上传的UploadedFile实例,这个用法存在错误——put方法的第二个参数需要文件内容(字符串/资源流),而非文件对象,这会导致请求体为空,触发Backblaze的InvalidRequest错误。

修复方案

改用Laravel专门处理文件上传的putFile或putFileAs方法:

  • 自动生成文件名:
Storage::disk('s3')->putFile('profile-photos', $photo);
  • 指定自定义文件名:
$customFileName = 'user-avatar.jpg';
Storage::disk('s3')->putFileAs('profile-photos', $photo, $customFileName);

错误2:Unsupported value for canned acl 'private'

问题原因

Backblaze B2虽兼容S3 API,但不支持S3默认的private ACL值,上传时传递该参数会触发InvalidArgument错误。不过文件能成功上传,因为B2默认权限就是私有,只是错误参数被忽略。

修复方案

有两种解决方式:

  1. 上传时跳过ACL参数:
// 不传ACL,使用B2默认私有权限
Storage::disk('s3')->putFile('profile-photos', $photo, []);

// 如果需要公开访问,使用B2支持的publicRead
Storage::disk('s3')->putFile('profile-photos', $photo, ['ACL' => 'publicRead']);
  1. 修改全局配置:
    打开config/filesystems.php,找到s3磁盘配置,移除默认的acl设置:
's3' => [
    'driver' => 's3',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION'),
    'bucket' => env('AWS_BUCKET'),
    'endpoint' => env('AWS_ENDPOINT'), // 你的Backblaze endpoint
    // 移除这一行:'acl' => 'private',
],

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 09:57:45