【问题标题】:Checksum Error while uploading files to BackBlaze (B2) using Ajax request使用 Ajax 请求将文件上传到 BackBlaze (B2) 时出现校验和错误
【发布时间】:2020-12-28 11:12:42
【问题描述】:

我花了很多时间尝试使用客户端 ajax 请求 (vue-dropzone.js) 将文件上传到 b2,即使我提供了文件的有效 sha1 校验和,b2 服务器仍然响应“校验和没有匹配收到的数据”,状态码为 400。我已经使用我拥有的所有工具检查并重新检查了校验和,但我仍然无法追踪错误的来源。好像文件在传输过程中发生了什么事。

我已经使用命令行工具上传了相同的文件,它工作正常,但是当我使用完全相同的 sha1 校验和通过 ajax 上传时,它不起作用。

我的问题是:

  1. b2 甚至允许通过 ajax 上传文件吗?

  2. 如果它确实允许通过 ajax 上传,那么我做错了什么?

  3. 文件在使用“X-Bz-Content-Sha1”、“do_not_verify”上传时是否仍然有效。因为我尝试过这样做只是为了在我下载回来时获取无效文件。

  4. 关于使用 ajax 请求将文件上传到 b2,我还需要了解其他事项

请查看我的 ajax 代码,看看我是否有任何错误:

             sending(file, xhr, formData) {
                // This function runs for each file right before they are sent by dropezone.
                // This is a good opportunity to insert file specific values
                // in this case the file's upload url, name and auth token
                let fileName = '';
                console.log('this is file type', file.type);
                if (file.type.includes('image')) {
                    fileName = 'images/${uuid.v1()}.png';
                } else if (file.type.includes('video')) {
                    fileName = 'videos/${uuid.v1()}.${file.type.split(' / ')[1]}';
                }
    
                const url = appConfig.serverAddress + '/catalog/submitFiles';
                console.log('this is sha1_hash', this.uploadInfo.sha1_hash);
                // open the xhr request and insert the file's upload url here
                xhr.open('Post', this.uploadInfo.url, true);
    
                // set b2's mandatory request headers
                // xhr.setRequestHeader(
                //  'Authorization',
                //  'Bearer ' + store.getters.getUserIdToken,
                // );
                xhr.setRequestHeader('Authorization', this.uploadInfo.authorizationToken);
                xhr.setRequestHeader('X-Bz-Content-Sha1', this.uploadInfo.sha1_hash);
                xhr.setRequestHeader('X-Bz-File-Name', fileName);
                xhr.setRequestHeader('Content-Type', 'b2/x-auto');
    
                formData = new FormData();
                formData.append('files', file);
    
                // the rest will be handled by dropzones upload pipeline
            }

【问题讨论】:

    标签: ajax dropzone.js sha1 b2 backblaze


    【解决方案1】:

    您正在使用表单编码发送文件,这会导致 SHA-1 验证失败,因为 B2 需要的是没有编码的原始文件数据。 doc for b2_upload_file 说:

    要上传的文件是消息体,没有经过任何编码。它不是 URL 编码的。它不是 MIME 编码的。

    我不是 vue-dropzone 方面的专家,但我猜您只需删除引用 formData 的两行即可。看起来默认上传管道将发送原始文件内容。

    【讨论】:

      猜你喜欢
      • 2022-07-12
      • 2021-12-10
      • 2019-02-14
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      相关资源
      最近更新 更多