Autodesk Data Management API - 获取图像响应 returns 二进制文件。怎么办?
Autodesk Data Management API - Get Image response returns binary. Now What?
所以使用 https://developer.api.autodesk.com/oss/v2/buckets/:bucketKey/objects/:objectName 和 javascript - 我返回了一个无法保存的二进制图像。我用过 fs、btoa、base64 和其他几个,但所有保存的文件都出现无法识别格式的错误。
Image Error
无论我尝试什么,我都会收到此错误,除非我使用邮递员并使用 saveas。我一直在寻找为什么这在邮递员中有效,但我似乎找不到任何可靠的答案。所以
这就是我的
try {
var data = null;
var access_token = JSON.parse(Atoken);
var settingspho = {
"url": "https://developer.api.autodesk.com/oss/v2/buckets/wip.dm.prod/objects/" + urnid,
"method": "GET",
"timeout": 0,
"headers": {
"Authorization": "Bearer " + access_token.access_token,
"Content-Type": "application/json"
},
};
$.ajax(settingspho).done(function (response, body) {
var data = 'data:image/jpeg;base64,' + btoa(response);
\ tried this too \var buf = new Buffer(data, 'base64');
const jsonfile = './photos/' + urnid;
fs.writeFile(jsonfile,buf, function (err) {
if (err) throw err;
});
});
}
catch (err) {
alert(err);
}
这是响应的快照Postman Body Response
要使用 jQuery 从 Forge OSS 服务下载二进制数据,您需要 jQuery 的自定义 Ajax 传输,这里有一个适用于您的示例:
顺便说一句,存储在BIM360上的项目的对象名称是基于GUID的,例如。 eae32ae2-ed34-41c2-8cfd-7bb9919fddcb.jpg
、066edf4c-e546-4cf9-bb6a-4c93968dad00.dwg
或 5df33424-1ee4-49fe-bf0f-8ca5b9642cd1.rvt
。您不能直接使用文件名。
所以经过一些修改和 Eason 的 post 下面是如何从 oss 下载文件..
try {
var access_token = JSON.parse(Atoken);
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === 4 && this.status === 200) {
var res = this.response;
const jsonfile = './photos/'+ urnid;
try {
fs.writeFile(jsonfile, toBuffer(res), function (err) {
if (err) throw err;
});
}
catch (err) {
alert(err);
}
}
});
xhr.open("GET", "https://developer.api.autodesk.com/oss/v2/buckets/wip.dm.prod/objects/" + urnid,);
xhr.setRequestHeader("Authorization", "Bearer " + access_token.access_token);
xhr.setRequestHeader("Content-Type", "application/octet-stream");
xhr.responseType = 'arraybuffer';
xhr.send();
}
catch (err) {
alert(err);
}
};
function toBuffer(ab) {
var buf = Buffer.alloc(ab.byteLength);
var view = new Uint8Array(ab);
for (var i = 0; i < buf.length; ++i) {
buf[i] = view[i];
}
return buf;
}
所以使用 https://developer.api.autodesk.com/oss/v2/buckets/:bucketKey/objects/:objectName 和 javascript - 我返回了一个无法保存的二进制图像。我用过 fs、btoa、base64 和其他几个,但所有保存的文件都出现无法识别格式的错误。
Image Error 无论我尝试什么,我都会收到此错误,除非我使用邮递员并使用 saveas。我一直在寻找为什么这在邮递员中有效,但我似乎找不到任何可靠的答案。所以
这就是我的
try {
var data = null;
var access_token = JSON.parse(Atoken);
var settingspho = {
"url": "https://developer.api.autodesk.com/oss/v2/buckets/wip.dm.prod/objects/" + urnid,
"method": "GET",
"timeout": 0,
"headers": {
"Authorization": "Bearer " + access_token.access_token,
"Content-Type": "application/json"
},
};
$.ajax(settingspho).done(function (response, body) {
var data = 'data:image/jpeg;base64,' + btoa(response);
\ tried this too \var buf = new Buffer(data, 'base64');
const jsonfile = './photos/' + urnid;
fs.writeFile(jsonfile,buf, function (err) {
if (err) throw err;
});
});
}
catch (err) {
alert(err);
}
这是响应的快照Postman Body Response
要使用 jQuery 从 Forge OSS 服务下载二进制数据,您需要 jQuery 的自定义 Ajax 传输,这里有一个适用于您的示例:
顺便说一句,存储在BIM360上的项目的对象名称是基于GUID的,例如。 eae32ae2-ed34-41c2-8cfd-7bb9919fddcb.jpg
、066edf4c-e546-4cf9-bb6a-4c93968dad00.dwg
或 5df33424-1ee4-49fe-bf0f-8ca5b9642cd1.rvt
。您不能直接使用文件名。
所以经过一些修改和 Eason 的 post 下面是如何从 oss 下载文件..
try {
var access_token = JSON.parse(Atoken);
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === 4 && this.status === 200) {
var res = this.response;
const jsonfile = './photos/'+ urnid;
try {
fs.writeFile(jsonfile, toBuffer(res), function (err) {
if (err) throw err;
});
}
catch (err) {
alert(err);
}
}
});
xhr.open("GET", "https://developer.api.autodesk.com/oss/v2/buckets/wip.dm.prod/objects/" + urnid,);
xhr.setRequestHeader("Authorization", "Bearer " + access_token.access_token);
xhr.setRequestHeader("Content-Type", "application/octet-stream");
xhr.responseType = 'arraybuffer';
xhr.send();
}
catch (err) {
alert(err);
}
};
function toBuffer(ab) {
var buf = Buffer.alloc(ab.byteLength);
var view = new Uint8Array(ab);
for (var i = 0; i < buf.length; ++i) {
buf[i] = view[i];
}
return buf;
}