使用 Autodesk 的 Forge OSS,我可以上传到一个桶,但下载的主体是空的
Using Autodesk's Forge OSS, I can upload to a bucket, but the body of the download is empty
我正在使用 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);
这是我的下载:
superagent
.get(_autodesk_api_baseurl
+ baseUrl
+ downloadOptions.bucket
+ '/objects/'
+ encodeURIComponent(downloadOptions.key))
.set('Authorization', 'Bearer '
+ token.access_token)
.query({'response-content-type': 'application/octet-stream'})
.end(function (err, resp) {
if (typeof callback === 'function') {
// All works fine
callback(undefined, 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的帮助下,我找到了问题。
- Superagent 似乎不起作用,但 Request 起作用。
- 不确定它是否有实际影响,但我将下载缓冲区的编码设置为 base64
- 我需要直接上传 Blob。我不必使用 FileReader 来读取字节。
不相信您需要内容类型来下载文件,see more here. Can you 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'));
});
}
这一段好像不对:
.query({'response-content-type': 'application/octet-stream'})
应该是
.set('response-content-type', 'application/octet-stream')
无论如何,Augusto 是正确的 - 除了授权
,您不需要提供任何额外的 header
解决问题的方法如下:
对于上传,我只需要发送 Blob。这是更新后的代码:
var url = uploadOptions.url;
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 201)) {
console.log(xhr.status);
console.log('UPLOAD FINISHED:', xhr.responseText);
callback();
}
};
xhr.open("PUT", url, true);
xhr.withCredentials = true;
// Send the Blob directly!!
xhr.setRequestHeader('Content-Type', uploadOptions.ContentType);
xhr.send(uploadOptions.Body);
对于下载,库 Superagent 不起作用,但 Request 起作用。我还将缓冲区的编码更改为 base64。这是代码:
request({
url: _autodesk_api_baseurl
+ baseUrl
+ downloadOptions.bucket
+ '/objects/'
+ encodeURIComponent(downloadOptions.key),
method: "GET",
headers: {
'Authorization': 'Bearer ' + token.access_token
},
encoding: null
}, function (error, response, body) {
//Error handling goes here
if (typeof callback === 'function') {
callback(null, new Buffer(body, 'base64'));
}
});
在那之后,我可以将缓冲区写入文件并打开它。感谢帮忙回答的人
我正在使用 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);
这是我的下载:
superagent .get(_autodesk_api_baseurl + baseUrl + downloadOptions.bucket + '/objects/' + encodeURIComponent(downloadOptions.key)) .set('Authorization', 'Bearer ' + token.access_token) .query({'response-content-type': 'application/octet-stream'}) .end(function (err, resp) { if (typeof callback === 'function') { // All works fine callback(undefined, 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的帮助下,我找到了问题。
- Superagent 似乎不起作用,但 Request 起作用。
- 不确定它是否有实际影响,但我将下载缓冲区的编码设置为 base64
- 我需要直接上传 Blob。我不必使用 FileReader 来读取字节。
不相信您需要内容类型来下载文件,see more here. Can you 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'));
});
}
这一段好像不对:
.query({'response-content-type': 'application/octet-stream'})
应该是
.set('response-content-type', 'application/octet-stream')
无论如何,Augusto 是正确的 - 除了授权
,您不需要提供任何额外的 header解决问题的方法如下:
对于上传,我只需要发送 Blob。这是更新后的代码:
var url = uploadOptions.url; var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 201)) { console.log(xhr.status); console.log('UPLOAD FINISHED:', xhr.responseText); callback(); } }; xhr.open("PUT", url, true); xhr.withCredentials = true; // Send the Blob directly!! xhr.setRequestHeader('Content-Type', uploadOptions.ContentType); xhr.send(uploadOptions.Body);
对于下载,库 Superagent 不起作用,但 Request 起作用。我还将缓冲区的编码更改为 base64。这是代码:
request({ url: _autodesk_api_baseurl + baseUrl + downloadOptions.bucket + '/objects/' + encodeURIComponent(downloadOptions.key), method: "GET", headers: { 'Authorization': 'Bearer ' + token.access_token }, encoding: null }, function (error, response, body) { //Error handling goes here if (typeof callback === 'function') { callback(null, new Buffer(body, 'base64')); } });
在那之后,我可以将缓冲区写入文件并打开它。感谢帮忙回答的人