英文:
Autodesk.Viewing.Document.load() documentId / urn structure
问题
我使用了Autodesk.Viewing.Document.load()函数 点击。文档指明第一个参数是文件的 URN。然而,如果我使用 js-base64 模块 点击 将 URN(urn:...)编码为 Base64(使用 encodeURI),然后调用
Autodesk.Viewing.Document.load(base64_decoded_urn, onSuccessCallback, onErrorCallback)
我从服务器收到 400 响应。
但是,当我调用
Autodesk.Viewing.Document.load('urn:' + base64_decoded_urn, onSuccessCallback, onErrorCallback)
文档可以被获取。然而,我实际上是使用 urn:urn:... 调用 load 函数,因为编码的 base64 URN 仍然包含前缀 'urn:'。
这种行为是否符合预期?
英文:
I am using the Autodesk.Viewing.Document.load() function click. The documentation states that the first parameter is the urn of the file. However if I encode a urn (urn:...) to Base64 (encodeURI) using the js-base64 module click and call
Autodesk.Viewing.Document.load(base64_decoded_urn, onSuccessCallback, onErrorCallback)
I get a 400 response from the server.
But when I call
Autodesk.Viewing.Document.load('urn:' + base64_decoded_urn, onSuccessCallback, onErrorCallback)
The document can be fetched. However, I am actually calling the load function with urn:urn:... because the encoded base64 urn still includes the prefix 'urn:'
Is this behavior desired?
答案1
得分: 0
这是正确的方式。
对于编码,你可以依赖于 urnify 方法:
service.urnify = (id) => Buffer.from(id).toString('base64').replace(/=/g, '');
就像我们在我们的 Simple Viewer 教程 中所做的一样。
在这种情况下,我们在 urn 前面添加了 urn
(参考 viewer.js):
export function loadModel(viewer, urn) {
return new Promise(function (resolve, reject) {
function onDocumentLoadSuccess(doc) {
resolve(viewer.loadDocumentNode(doc, doc.getRoot().getDefaultGeometry()));
}
function onDocumentLoadFailure(code, message, errors) {
reject({ code, message, errors });
}
viewer.setLightPreset(0);
Autodesk.Viewing.Document.load('urn:' + urn, onDocumentLoadSuccess, onDocumentLoadFailure);
});
}
而传递给 loadModel
函数的 urn
值是经过 base64 编码的,正如我们在 '/api/models'
终端点中看到的(参考 这里):
router.post('/api/models', formidable(), async function (req, res, next) {
const file = req.files['model-file'];
if (!file) {
res.status(400).send('The required field ("model-file") is missing.');
return;
}
try {
const obj = await uploadObject(file.name, file.path);
await translateObject(urnify(obj.objectId), req.fields['model-zip-entrypoint']);
res.json({
name: obj.objectKey,
urn: urnify(obj.objectId)
});
} catch (err) {
next(err);
}
});
英文:
Yes, this is the correct way.
For encoding you can rely on urnify method:
service.urnify = (id) => Buffer.from(id).toString('base64').replace(/=/g, '');
just like we do in our Simple Viewer tutorial.
In this case, we're prefixing the urn with urn
(refer to viewer.js):
export function loadModel(viewer, urn) {
return new Promise(function (resolve, reject) {
function onDocumentLoadSuccess(doc) {
resolve(viewer.loadDocumentNode(doc, doc.getRoot().getDefaultGeometry()));
}
function onDocumentLoadFailure(code, message, errors) {
reject({ code, message, errors });
}
viewer.setLightPreset(0);
Autodesk.Viewing.Document.load('urn:' + urn, onDocumentLoadSuccess, onDocumentLoadFailure);
});
}
And the value of the urn
passed to loadModel
function is base64-encoded, as we can see at '/api/models'
endpoint (refer here):
router.post('/api/models', formidable(), async function (req, res, next) {
const file = req.files['model-file'];
if (!file) {
res.status(400).send('The required field ("model-file") is missing.');
return;
}
try {
const obj = await uploadObject(file.name, file.path);
await translateObject(urnify(obj.objectId), req.fields['model-zip-entrypoint']);
res.json({
name: obj.objectKey,
urn: urnify(obj.objectId)
});
} catch (err) {
next(err);
}
});
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论