1

我正在尝试将文件上传到我不知道内容长度的 Skydrive。使用其他存储服务,我可以通过分块 HTTP 上传来做到这一点,但 Skydrive 总是抱怨 Content-Length 无效。

以下是我发送的完整标题:

PUT /v5.0/me/skydrive/files/skydrive_test.js?overwrite=ChooseNewName HTTP/1.1
Authorization: Bearer <TOKEN_REDACTED>
host: apis.live.net
content-type: application/javascript
Connection: keep-alive
Transfer-Encoding: chunked

这是我得到的回复:

cache-control: private, no-cache, no-store, must-revalidate
transfer-encoding: chunked
content-type: application/json; charset=UTF-8
server: Live-API/16.4.1731.327 Microsoft-HTTPAPI/2.0
x-content-type-options: nosniff
x-http-live-request-id: API.c6afda25-2d9f-4248-9f49-001ccb3a9007
x-http-live-server: BAYMSG1010836
date: Wed, 15 May 2013 14:33:00 GMT

{   "error": {      "code": "request_invalid_content_length",
   "message": "The value for the Content-Length header isn't valid."   }}

有什么方法可以在不设置 Content-Length 的情况下做到这一点(即使用分块编码)?

我正在使用 node.js 来执行此操作,但它应该同样适用于使用 REST API 的任何语言,因此我没有用特定语言标记它。

例如 Dropbox 提供分块上传命令:https ://www.dropbox.com/developers/core/docs#chunked-upload

而 Google Drive,即使它说它需要 Content-Length,也不需要它,因为它的可恢复上传 API:https ://developers.google.com/drive/manage-uploads#resumable

有没有我缺少的 API?

编辑:我尝试过的事情:设置 Content-Length: 0 会导致它工作,但文件是零字节。设置 Content-length:0 和 Transfer-Encoding: chunked,会导致上面的原始错误。

4

1 回答 1

0

尝试设置一个假人content-length,看看它是否可以接受。否则设置文件大小。
如果您正在使用node.js,您可以获取您尝试上传的文件大小并将大小设置为content-lengthOCTET。您可以在 node.js 中获取(文件系统)模块requiring的文件大小。fs

var fs = require('fs');
fs.watchFile('some.file', function () {
    fs.stat('some.file', function (err, stats) {
        console.log(stats.size);
    });
});

@资源

于 2013-05-15T15:15:17.237 回答