javascript - 内容长度标头与分块上传的请求正文不匹配
问题描述
你好,
我在使用 dropzone.js 分块上传到 google-cloud-storage (gcs) 时遇到问题。
我想做什么:
我想通过 dropzone 将(更大的)文件上传到 google-cloud-storage。由于它是一个非常大的文件,我正在使用 dropzone 的内部函数来分块(和上传)它。我正在尝试通过我正在创建、初始化并随后传递给 dropzone 的签名 url 上传,以便它知道将文件发送到哪里。我还在Content-Range
请求中添加了一个标头,以便 gcs 跟踪当前的文件上传状态。
当前状态:
当下载开始时,它似乎工作。但是在第一个块完成后,dropzone 会尝试重新上传第一个块,因为 xhr-response 状态是 400。
问题:
当调查 xhr 请求和响应时,它显示Content Length
和Content-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 自动添加。
我的问题:
这 4 行是从哪里来的?
我可以(重新)设置 xhr 请求正文吗?
我的问题可能是由文件数据的一些格式问题引起的吗?(如字节、字符串)?
如果这不是问题 - 你还有其他想法可能是什么问题?
非常感谢! 任何帮助appriced!如果您需要更多信息,请询问!
解决方案
推荐阅读
- c# - 对齐多个图表
- prometheus - 具有“probe_http_status_code”指标值的 Blackbox Exporter 警报
- java - java中的String[] S,在其中添加值,现在再创建2个数组,even[]应包含具有偶数索引号的值S[]和具有奇数索引号的odd[]
- javascript - webpack 构建后,bundle.js 中未定义导出的函数
- apache-spark - 来自另一个表的分区列上的 Spark 条件(性能)
- java - 为什么我的 switch 语句在 GUI Netbeans 中不起作用?
- wpf - WPF WindowChrome 不需要的黑色阴影 - 由 SizeToContent="WidthAndHeight" 引起
- java - M:N 表不更新
- julia - 以不同的顺序加载 Flux 和 CuArray 会导致错误
- mysql - 如何在另一个 Select 语句中使用一个 select 语句的输出?