2

我花了很多时间尝试使用客户端 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
            }
4

1 回答 1

0

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

要上传的文件是消息体,不以任何方式编码。它不是 URL 编码的。它不是 MIME 编码的。

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

于 2022-02-26T18:35:30.117 回答