0

我正在使用 Autodesk 的 Forge 对象存储服务,虽然我可以将文件上传到我的存储桶,但当我尝试下载它时,正文却是空的。但是,使用 时Head,数据大小是正确的。

这是我的上传(请注意,我使用的是签名的 url 上传 API):

            var url = uploadOptions.url;

            var fileReader = new FileReader();
            // UploadOptions.Body contains a Blob
            fileReader.readAsBinaryString(uploadOptions.Body);
            fileReader.onloadend = function (e) {
                var xhr = new XMLHttpRequest();
                var lastLoadedValue = 0;
                xhr.onreadystatechange = function () {
                    if (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 201)) {
                        console.log('UPLOAD FINISHED:', xhr.responseText);
                        callback();
                    }
                };
                xhr.open("PUT", url, true);
                xhr.withCredentials = true;
                // uploadOptions.ContentType = 'application/octet-stream'
                xhr.setRequestHeader('Content-Type', uploadOptions.ContentType);
                xhr.send(e.target.result);

这是我的下载:

         超级代理
            .get(_autodesk_api_baseurl
                + 基本网址
                + 下载选项.bucket
                + '/对象/'
                + encodeURIComponent(downloadOptions.key))
            .set('授权', '承载'
                + token.access_token)
            .query({'response-content-type': 'application/octet-stream'})
            .end(function (err, resp) {
                if (typeof callback === 'function') {
                    //一切正常
                    回调(未定义,resp);
                }
            });

然后,在回调中,我打印我的响应并且正文是空的。我什至将 JSON 编码的响应写入一个文件来得到这个:

{
"req": {
    "method": "GET",
    "url": "https://developer.api.autodesk.com/oss/v2/buckets/storage.vcs.prod.mevsg.autodesk.com/objects/assets%2FNT5NR9KJU2PH%2Fea02ec77505f2ea2defac93fe231764f2916e4d1aeaac7d92945a08a0086c60667369431361d5aa426d4cccca49b9e4c7cb70bc6ebf700258a3cb37617eacfa0"
},
"header": {
    "access-control-allow-credentials": "true",
    "access-control-allow-headers": "Authorization, Accept-Encoding, Range, Content-Type",
    "access-control-allow-methods": "GET",
    "access-control-allow-origin": "*",
    "content-disposition": "attachment; filename=\"ea02ec77505f2ea2defac93fe231764f2916e4d1aeaac7d92945a08a0086c60667369431361d5aa426d4cccca49b9e4c7cb70bc6ebf700258a3cb37617eacfa0\"",
    "content-encoding": "gzip",
    "content-type": "application/octet-stream",
    "date": "Thu, 30 Jun 2016 18:03:10 GMT",
    "etag": "\"8ad9c59b256cef48798a94c0295023088016d43a\"",
    "server": "Apigee Router",
    "vary": "Accept-Encoding",
    "transfer-encoding": "chunked",
    "connection": "Close"
},
"status": 200

}

如你所见,没有身体。但是当我Head在对象上使用时,我得到了正确的字节数。

有人可以告诉我我做错了什么吗?我尝试对 Content-Type 进行硬编码application/x-www-form-urlencoded,然后我可以下载文件(正文中有字节),但字节略有改变。例如,208(11010000)变为 80(1010000)。如您所见,第一位被颠倒了。使用该内容类型,我无法打开文件。我应该使用哪种方式?


更新:在奥古斯托的帮助下,我发现了问题。

  1. Superagent 似乎不起作用,但 Request 起作用。
  2. 不确定它是否有真正的影响,但我将下载缓冲区的编码设置为 base64
  3. 我需要直接上传 Blob。我不必使用 FileReader 来读取字节。
4

3 回答 3

1

这是解决问题的方法:

对于上传,我只需要发送 Blob。这是更新的代码:

    var url = 上传选项.url;

    var xhr = new XMLHttpRequest();

    xhr.onreadystatechange = 函数 () {
        if (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 201)) {
            控制台.log(xhr.status);
            console.log('上传完成:', xhr.responseText);
            打回来();
        }
    };

    xhr.open("PUT", url, true);
    xhr.withCredentials = true;
    // 直接发送 Blob!!
    xhr.setRequestHeader('Content-Type', uploadOptions.ContentType);
    xhr.send(uploadOptions.Body);

对于下载,库 Superagent 不起作用,但 Request 起作用。我还将缓冲区的编码更改为base64。这是代码:

    要求({
        网址:_autodesk_api_baseurl
            + 基本网址
            + 下载选项.bucket
            + '/对象/'
            + encodeURIComponent(downloadOptions.key),
        方法:“获取”,
        标题:{
            '授权':'承载' + token.access_token
        },
        编码:空
    },函数(错误,响应,正文){
        //错误处理在这里

        if (typeof callback === 'function') {
            回调(空,新缓冲区(主体,'base64'));
        }
    });

之后,我可以将缓冲区写入文件并打开它。感谢那些帮助回答的人。

于 2016-07-13T14:53:53.940 回答
0

不要相信您需要 content-type 来下载文件,请在此处查看更多信息。你能要求文件的详细信息吗?

这是下载它应该工作的卷曲:

curl -v "https://developer.api.autodesk.com/oss/v2/buckets/storage.vcs.prod.mevsg.autodesk.com/objects/assets%2FNT5NR9KJU2PH%2Fea02ec77505f2ea2defac93fe231764f2916e4d1aeaac7d92945a08a0086c60667369431361d5aa426d4cccca49b9e4c7cb70bc6ebf700258a3cb37617eacfa0"
  -X GET
  -H "Authorization: Bearer AbCdEfGhIjKlMnOpQrStUvXwYz"

这是我与 NodeJS/Request 模块一起使用的代码。它实际上很通用,但是如果我传递 /oss/ URL 资源,它就可以正常工作。我不确定您使用的是哪个库,抱歉。

function download(resource, token, onsuccess) {
    console.log('Downloading ' + config.baseURL + resource); // debug
    request({
        url: config.baseURL + resource,
        method: "GET",
        headers: {
            'Authorization': 'Bearer ' + token,
        },
        encoding: null
    }, function (error, response, body) {
        onsuccess(new Buffer(body, 'base64'));
    });
}
于 2016-06-30T18:39:58.667 回答
0

这部分似乎不正确:

.query({'response-content-type': 'application/octet-stream'})

它应该是

.set('response-content-type', 'application/octet-stream')

无论如何,Augusto 是正确的 - 除了 Authorization 之外,您不需要提供任何其他标题

于 2016-06-30T19:07:03.057 回答