背景

目前Cloudreve官方文档的对接方法有些问题。设置完成后很有可能出现以下问题。

https://pic.cosmiccat.net/uploads/2023/12/18/b2-1.jpg
https://pic.cosmiccat.net/uploads/2023/12/18/b2-2.jpg

CORS Access-Control-Allow-Origin header 缺失导致Network Error错误问题

https://pic.cosmiccat.net/uploads/2023/12/18/b2-3.jpg

分片上传InvalidPart问题(由Etag导致)(Unable to complete file upload: One or more of the specified parts could not be found.)

其实Cloudreve本身没有问题,是由于B2一些S3兼容设置问题导致的。

为了解决以上问题,必须使用b2-cli去更加详细地配置b2存储桶。

同时,根据https://www.nodeseek.com/post-48652-1#4, 在电脑端chrome和edge下可能还会出现cloudreve无法上传文件后缀为exe和apk的文件的问题。经过测试可能是由Adblock,IDM Integration Module等浏览器拓展引起的。可能需要在cloudreve页面里禁用它们。

本文需要:

  • 一个已经创建了存储桶的B2账号。
  • 一个用于运行b2 CLI的机器,随便一台linux或者windows机器都行。
  • 一个已经能正常运行的cloudreve程序并已经对接了b2. (至少下载功能正常)

B2 配置存储桶

首先我们需要下载B2 CLI

官方文档:CLI Tools (backblaze.com)

本文以Linux机器为例:

#使用wget下载b2 cli二进制文件
wget https://github.com/Backblaze/B2_Command_Line_Tool/releases/latest/download/b2-linux
#加上运行权限
chmod +x b2-linux
#登录b2账号,请提前在后台创建api key
./b2-linux authorize_account

接下来设置存储桶

对于CORS问题,其实是由于默认情况下b2的s3的操作没有被加入到Access-Control-Allow-Methods列表里, 服务器端CORS鉴权失败不返回Access-Control-Allow-Origin 导致浏览器报出Network Error问题。 解决方法为在b2的allowedOperations里面(无法在网页里面设置)加上
"s3_put","s3_post","s3_get","s3_delete" 方法。

"allowedOperations": [
   "b2_download_file_by_id",
   "b2_download_file_by_name",
   "b2_upload_file",
   "b2_upload_part",
   "s3_put",
   "s3_post",
   "s3_get",
   "s3_delete"
],

对于分片上传失败问题,这是由于默认情况下B2 S3兼容API不会返回一些S3 Header。由于S3分片上传需要服务端返回Etag header去区分每一个上传的part,而b2默认不返回,在最后合并已上传的part的时候会缺失每一个Part的Etag值并导致文件合并失败。 解决方法为允许B2返回Etag header。

 "exposeHeaders": ["ETag"],

于是,组合好的命令是:

./b2-linux update-bucket --corsRules 
       [     
          {
              "corsRuleName": "downloadFromAnyOriginWithUpload",
              "allowedOrigins": [
                  "*"
              ],
              "allowedHeaders": [
                  "authorization",
                  "content-type",
                  "x-bz-file-name",
                  "x-bz-content-sha1"
              ],
              "allowedOperations": [
                  "b2_download_file_by_id",
                  "b2_download_file_by_name",
                  "b2_upload_file",
                  "b2_upload_part",
                  "s3_put",
                  "s3_post",
                  "s3_get",
                  "s3_delete"
              ],
              "exposeHeaders": ["ETag"],
              "maxAgeSeconds": 3600
          }
      ]; 你的Bucket名 allPrivate   #如果是公有桶就填allPublic

运行完以上命令,你的cloudreve的上传功能就应该能正常工作了。