APS Viewer加载STEP模型时遇TranslationWorker解压失败问题求助
解决APS模型转换「TranslationWorker-Internal Failure: Tr worker failed to unzip」错误
问题核心分析
你遇到的解压失败错误,并非模型文件本身问题(VSCode APS扩展可成功转换验证了这一点),而是转换请求的参数和代码细节存在错误,导致Model Derivative服务误判文件类型并尝试执行不必要的解压操作。
关键错误点及修复方案
错误设置
compressedUrn参数
你的STEP模型是直接上传的非压缩文件,但请求体中设置了compressedUrn: true,这会强制服务尝试解压该文件,进而触发解压失败错误。
修复:将compressedUrn改为false。Authorization请求头缺少
Bearer前缀
代码中仅传入token字符串,不符合API要求的授权格式,可能引发权限验证异常,间接导致转换失败。
修复:授权头格式改为Bearer <your-access-token>。URL中多余的
$符号
两个API请求的URL开头存在多余的$字符,会导致请求地址无效,属于潜在的语法错误。
修复:移除URL中的$符号。状态检查变量不统一
循环中使用modelURN检查状态,但前面定义的变量是URN,可能导致检查错误的模型状态。
修复:统一使用URN变量。
修复后的完整代码示例
// 生成符合要求的URN const base64EncodedObjectId = window.btoa(objectId); const base64EncodedObjectIdURLSafe = base64EncodedObjectId.replace(/\+/g, '-').replace(/\//g, '_'); const URN = base64EncodedObjectIdURLSafe.replace(/=+$/, ''); const startTranslationToSVF = async (URN, modelName) => { const token = await getAutodeskBearerToken(); const importURL = "https://developer.api.autodesk.com/modelderivative/v2/designdata/job"; const headers = { Authorization: `Bearer ${token}`, "Content-Type": "application/json" }; const body = { input: { urn: URN, compressedUrn: false, rootFilename: modelName }, output: { destination: { region: "us" }, formats: [ { type: "svf", views: ["2d", "3d"] } ] } }; try { const resp = await axios.post(importURL, body, { headers }); return resp; } catch (error) { return onHandleError(error); } }; const checkSVFTranslationStatus = async (URN) => { const token = await getAutodeskBearerToken(); const importURL = `https://developer.api.autodesk.com/modelderivative/v2/designdata/${URN}/manifest`; const headers = { Authorization: `Bearer ${token}` }; try { const resp = await axios.get(importURL, { headers }); return resp; } catch (error) { return onHandleError(error); } }; const expectedStatus = "complete"; let translationStatus = "incomplete"; // 执行转换及状态轮询 await startTranslationToSVF(URN, modelName); while (translationStatus !== expectedStatus) { const status = await checkSVFTranslationStatus(URN); if (status.data.progress === "complete") { translationStatus = "complete"; console.log("translation completed"); break; } await new Promise(resolve => setTimeout(resolve, 2500)); }
额外建议
- 确认上传的STEP文件完整性:本地用CAD软件打开验证文件是否损坏。
- 检查token权限:确保获取的token包含
data:read和data:write权限,这是模型转换的必要权限。 - 调整状态轮询间隔:对于大模型,可适当延长间隔时间,避免触发API限流。
内容的提问来源于stack exchange,提问作者Praful Bharate
相关产品推荐
相关产品推荐

