首页 > 解决方案 > 内容长度标头与分块上传的请求正文不匹配

问题描述

你好,

我在使用 dropzone.js 分块上传到 google-cloud-storage (gcs) 时遇到问题。


我想做什么:

我想通过 dropzone 将(更大的)文件上传到 google-cloud-storage。由于它是一个非常大的文件,我正在使用 dropzone 的内部函数来分块(和上传)它。我正在尝试通过我正在创建、初始化并随后传递给 dropzone 的签名 url 上传,以便它知道将文件发送到哪里。我还在Content-Range请求中添加了一个标头,以便 gcs 跟踪当前的文件上传状态。


当前状态:

当下载开始时,它似乎工作。但是在第一个块完成后,dropzone 会尝试重新上传第一个块,因为 xhr-response 状态是 400。


问题

当调查 xhr 请求和响应时,它显示Content LengthContent-Range标头的大小不同。这也是响应文本告诉我的错误所在。

我的代码在.on("sending")dropzone 中:

let procChunks = file.upload.chunks; // Get all chunks processed until now
latestChunk = procChunks[procChunks.length-1]; // Select latest chunk
const chunkFirstByte = dz.options.chunkSize * latestChunk.index; // Calc first byte
const chunkLastByte = chunkFirstByte + (latestChunk.dataBlock.data.size-1); // Calc last byte
let header = "bytes "+chunkFirstByte+"-"+chunkLastByte +"/"+ (file.size-1); // Create header value
xhr.setRequestHeader("Content-Range", header); // Set header to xhr

请求标头:

PUT /upload/storage/v1/b/(myBucket)/o?uploadType=resumable&name=test2.fna&upload_id=(myUpLoadID) HTTP/2
    Host: storage.googleapis.com
    User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0
    Accept: application/json
    Accept-Language: de,en-US;q=0.7,en;q=0.3
    Accept-Encoding: gzip, deflate, br
    Cache-Control: no-cache
    X-Requested-With: XMLHttpRequest
    Content-Range: bytes 0-8388607/13088352
    Content-Type: multipart/form-data; boundary=---------------------------428770732237854445893641225227
    Content-Length: 8388843
    Origin: http://127.0.0.1:5000
    Connection: keep-alive
    Referer: http://127.0.0.1:5000/upload
    TE: Trailers

请求正文:

-----------------------------428770732237854445893641225227
Content-Disposition: form-data; name="file"; filename="test2.fna"
Content-Type: application/octet-stream

>NC_000913.3 Escherichia coli str. K-12 substr. MG1655, complete genome
AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGCTTCTGAACTG
GTTACCTGCCGTGAGTAAATTAAAATTTTATTGACTTAGGTCACTAAATACTTTAACCAATATAGGCATAGCGCACAGAC
AGATAAAAATTACAGAGTACACAACATCCATGAAACGCATTAGCACCACCATTACCACCACCATCACCATTACCACAGGT
AACGGTGCGGGCTGACGCGTACAGGAAACACAGAAAAAAGCCCGCACCTGACAGTGCGGGCTTTTTTTTTCGACCAAAGG
TAACGAGGTAACAACCATGCGAGTGTTGAAGTTCGGCGGTACATCAGTGGCAAATGCAGAACGTTTTCTGCGTGTTGCCG
ATATTCTGGAAAGCAATGCCAGGCAGGGGCAGGTGGCCACCGTCCTCTCTGCCCCCGCCAAAATCACCAACCACCTGGTG
GCGATGATTGAAAAAACCATTAGCGGCCAGGATGCTTTACCCAATATCAGCGATGCCGAACGTATTTTTGCCGAACTTTT
GACGGGACTCGCCGCCGCCCAGCCGGGGTTCCCGCTGGCGCAATTGAAAACTTTCGTCGATCAGGAATTTGCCCAAATAA
AACATGTCCTGCATGGCATTAGTTTGTTGGGGCAGTGCCCGGATAGCATCAACGCTGCGCTGATTTGCCGTGGCGAGAAA
ATGTCGATCGCCATTATGGCCGGCGTATTAGAAGCGCGCGGTCACAACGTTACTGTTATCGATCCGGTCGAAAAACTGCT
GGCAGTGGGGCATTACCTCGAATCTACCGTCGATATTGCTGAGTCCACCCGCCGTATTGCGGCAAGCCGCATTCCGGCTG
ATCACATGGTGCTGATGGCAGGTTTCACCGCCGGTAATGAAAAAGGCGAACTGGTGGTGCTTGGACGCAACGGTTCCGAC
TACTCTGCTGCGGTGCTGGCTGCCTGTTTACGCGCCGATTGTTGCGAGATTTGGACGGACGTTGACGGGGTCTATACCTG
CGACCCGCGTCAGGTGCCCGATGCGAGGTTGTTGAAGTCGATGTCCTACCAGGAAGCGATGGAGCTTTCCTACTTCGGCG
CTAAAGTTCTTCACCCCCGCACCATTACCCCCATCGCCCAGTTCCAGATCCCTTGCCTGATTAAAAATACCGGAAATCCT
CAAGCACCAGGTACGCTCATTGGTGCCAGCCGTGATGAAGACGAATTACCGGTCAAGGGCATTTCCAATCTGAATAACAT
GGCAATGTTCAGCGTTTCTGGTCCGGGGATGAAAGGGATGGTCGGCATGGCGGCGCGCGTCTTTGCAGCGATGTCACGCG
CCCGTATTTCCGTGGTGCTGATTACGCAATCATCT

响应文本:

Invalid request.  There were 8388843 byte(s) (or more) in the request body.  There should have been 8388608 byte(s) (starting at offset 0 and ending at offset 8388607) according to the Content-Range header.

您可能会看到前 4 行不是来自文件。


附加信息:

该文件是纯文本数据(我猜是utf-8编码)。我分块为 8mb 大块(由谷歌推荐)。在谷歌的 api 指南的某个地方,我读到通过上传时PUT应该/必须没有其他数据,除了文件数据。 Content-Length标题由 dropzone 自动添加。


我的问题:

  1. 这 4 行是从哪里来的?

  2. 我可以(重新)设置 xhr 请求正文吗?

  3. 我的问题可能是由文件数据的一些格式问题引起的吗?(如字节、字符串)?

  4. 如果这不是问题 - 你还有其他想法可能是什么问题?


非常感谢! 任何帮助appriced!如果您需要更多信息,请询问!

标签: javascripthttpxmlhttprequestgoogle-cloud-storagedropzone

解决方案


推荐阅读