背景
目前Cloudreve官方文档的对接方法有些问题。设置完成后很有可能出现以下问题。
CORS Access-Control-Allow-Origin header 缺失导致Network Error错误问题
分片上传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的上传功能就应该能正常工作了。