【问题标题】:Using Autodesk's Forge OSS, I can upload to a bucket, but the body of the download is empty使用Autodesk的Forge OSS,我可以上传到一个bucket,但是下载的body是空的
【发布时间】:2016-11-02 23:46:31
【问题描述】:

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

这是我的上传(注意我使用的是签名的 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)。如您所见,第一位被颠倒了。使用该内容类型,我无法打开文件。我应该使用哪种方式?


更新: 在 Augusto 的帮助下,我找到了问题所在。

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

【问题讨论】:

    标签: javascript node.js object-storage autodesk-forge


    【解决方案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')); } });

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

    【讨论】:

      【解决方案2】:

      这部分似乎不对:

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

      应该是

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

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

      【讨论】:

      • 内容类型是后来添加的,当时我不知道还有什么可以修复它。所以,是的,我会删除它。
      【解决方案3】:

      不要认为您需要 content-type 来下载文件,see more here。你能request the details这个文件吗?

      这个 curl 下载它应该可以工作:

      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'));
          });
      }
      

      【讨论】:

      • 是的,我可以获得文件的详细信息。我还尝试使用您的 cUrl 下载(我必须生成一个新令牌)并且我可以正确下载文件。所以它确认文件在服务器上。后来当我尝试任何方法使其工作时添加了内容类型,所以这不是答案。感谢您的回答。
      • 我用我正在使用(并且有效)的代码编辑了我的答案
      • 我试过你的代码。它起作用了,我得到了身体,我可以把它写到一个文件中。所以我想这只是我的库有问题或者 OSS 不喜欢它。之后我无法打开文件。这是一个 3ds Max 文件,当我打开它时,它显示“文件打开失败”。我想这是编码的问题。无论如何,除非您已经从那里的代码中知道问题所在,否则我会尝试,如果我无法弄清楚,我会再问一个问题。
      • 可能与编码有关...我正在使用:new Buffer(body,'base64')
      • 再次感谢您的帮助,我设法找到了其余的问题。是我上传的。我发送了读取的字节,但我只需要发送 Blob。现在一切正常:)
      猜你喜欢
      • 2021-08-16
      • 2017-08-06
      • 2017-12-31
      • 2017-10-26
      • 2021-06-19
      • 2019-04-25
      • 2019-10-02
      • 2016-12-15
      • 2020-04-14
      相关资源
      最近更新 更多