【问题标题】:Forge Data management returns zip fileForge 数据管理返回 zip 文件
【发布时间】:2022-02-09 04:18:08
【问题描述】:

当我获得在云中获得的 Revit 模型的下载链接时,如 here 所示。我发现有时链接会返回 Revit 文件,有时会返回 zip 文件。我将此 URL 传递给 Design Automation,因此它有时会失败(以防链接下载 zip 文件)。当item.data.attributes.displayName 在这两种情况下都返回 *.rvt 时,我如何区分这两个项目。以及在所有情况下应该如何获取 rvt 文件?

question 这个question 讨论了同样的问题,但没有解决方案(它已经存在 2 年了,希望有所改变)。

【问题讨论】:

    标签: autodesk-forge autodesk-bim360 autodesk-data-management


    【解决方案1】:

    Revit 4 工作共享,将文件发布到 BIM360。

    这个文件被命名为.rvt 文件(即'mybigrevitproject.rvt'),但实际上,它实际上是一个伪装的zip 文件。如果你把它重命名为 zip,下载它并解压,你会发现 zip 里面有很多 .RVT。

    有一个巧妙的技巧可以解决这个问题,而无需下载整个文件。

    在前 16 个字节上使用范围 GET,并检查魔术头。

    有关详细信息,请查看此回购:https://github.com/wallabyway

    这里有一个可以帮助的代码的 sn-p: https://github.com/wallabyway/bim360-zip-extract/blob/master/server.js#L167


    更新: 我的意思是说这个回购:https://github.com/wallabyway/bim360-zip-extract

    您可以根据此处的 pkzip 信息找到神奇的标头签名:https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html

    The signature of the local file header. This is always '\x50\x4b\x03\x04'.
    

    范围获取的代码是:

    const chunksize = 16 * 1024; // only need 16k bytes of data
    const buffSignature = await this._fetchWrite(0, chunksize); // fetch/write header   
    
    // something like this...
    if (buffSignature.slice(0,3) === \x50\x4b\x03\x04)  {
       console.log("this is a zip file, not a Revit file...");
    }
    
    
    async _fetchWrite( offset, length ) {
            const res = await fetch( this.URL, { headers: {
                'range': `bytes=${offset}-${offset+length}`,
                'Authorization': `Bearer ${this.token}`
            }});
            if (res.status != 206) 
                throw(`error:${res.statusText}, bytes=${offset}-${offset+length}`)
            const buff = await res.buffer();
            return buff;
    }
    

    【讨论】:

    • 我能够使用您的建议提取文件。但是,由于某种原因,我无法使用此forge.autodesk.com/blog/check-version-revit-file-hosted-cloud 来确定 zip 文件的 Revit 版本。它确实适用于普通文件。
    • 没错。当 Model Derivative API 将 Revit 提取为 SVF 格式时,它可以查看它正在处理的 Revit 版本,并将其添加到清单中。但是,在这种情况下,正在处理一个 zip 文件,它不是 Revit 文件,因此特殊版本参数不会像博客文章所建议的那样添加到清单中。您必须从 zip 中提取 Revit 文件,然后将其上传到 Model Dev。然后查看版本号。有道理吗?
    • 帖子(原始部分)展示了如何从编码字节中提取版本,这就是我尝试过的。这比上传到 Model Dev 更容易。是否可以从编码字节中提取信息?
    • 是的,你是对的。您将在 GitHub 存储库中使用相同的 4 个步骤。 nodejs 代码将下载页眉字节、页脚字节,将字节偏移量定位到您的 master.rvt 文件中,将字节偏移量和长度抓取到您的 Revit 文件中,然后对整个 revit 文件执行 zip 解压缩以找到神奇的标头。您可以测试压缩形式的魔术头作为赌博。或者 .. 破解 zip 库以解压缩魔术头(但那是 ninja 领域) - 不值得付出努力,收获甚微。
    猜你喜欢
    • 2021-06-03
    • 2019-11-16
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2018-07-13
    • 2019-03-30
    相关资源
    最近更新 更多