php用b2官方sdk读取文件列表需先调用authorizeaccount获取并缓存authorizationtoken(有效期24小时),再用bucketid(非名称)调用listfiles,分页依赖startfilename而非offset。

PHP怎么用SDK读取B2的文件列表
官方SDK(b2-sdk-php)默认不自动刷新授权,首次调用 listFiles 前必须确保已获取有效 authorizationToken。常见错误是直接 new Client 后就查文件,结果报 401 Unauthorized。
实操建议:
- 先调用
authorizeAccount获取accountId和applicationKey,并缓存返回的authorizationToken(有效期24小时) -
listFiles的bucketId必须是 bucket 的 ID,不是名称;可通过listBuckets先查 ID - 分页靠
startFileName而非 offset,重复请求时把上一页最后一个fileName传进去
PHP上传文件到B2用 uploadFile 还是 startLargeFile
小文件(≤100MB)直接用 uploadFile;大文件必须走分片流程:先 startLargeFile 得到 fileId,再多次 uploadPart,最后 finishLargeFile。硬用 uploadFile 传 200MB 文件会触发超时或内存溢出。
关键细节:
-
uploadFile的fileName不能含/开头,否则 B2 会拒绝(提示invalid_file_name) - 分片上传时每个
uploadPart的partNumber从 1 开始连续递增,跳号或重复会导致finishLargeFile失败 - 所有上传接口都要求传
Content-Type,空字符串或缺失会返回400 Bad Request
PHP读取B2文件内容为什么总返回空或乱码
不是直接 GET 文件 URL 就能读——B2 的文件默认不公开,必须带 Authorization 请求头,或先调用 getDownloadAuthorization 换临时下载 token。
更稳妥的做法是用 SDK 的 downloadFileById 或 downloadFileByName,它们自动处理鉴权和重定向。常见踩坑点:
- 手动拼下载 URL 时漏了
?Authorization=xxx查询参数,或 token 过期未刷新 - 用
file_get_contents直接读 URL,但没配stream_context_create带 header,被 403 拦截 - 文件是 gzip 压缩的(B2 自动压缩文本类资源),但 PHP 没开
zlib扩展,返回二进制乱码
PHP操作B2的错误码怎么快速定位
B2 的 HTTP 状态码和 body 中的 code 字段要一起看。比如 404 Not Found 可能对应 nonexistent_bucket(桶不存在)或 not_found(文件不存在),处理逻辑完全不同。
建议在 catch 异常后立刻检查 $e->getCode() 和 $e->getResponseBody():
-
bad_request:参数格式错,如bucketName含下划线、fileName含控制字符 -
too_many_requests:默认限流 5 QPS,批量操作需加usleep(200000)控制节奏 -
conflict:并发写同名文件且启用了覆盖保护(fileRetention或legalHold)
真正麻烦的是跨区域桶(如 US-West 的 bucket 在 EU-Central 调用 SDK),会静默降级为 403,得手动指定 apiUrl 和 downloadUrl。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











