Forge 数据管理 returns zip 文件

Forge Data management returns zip file

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

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

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

这个文件被命名为.rvt文件(即'mybigrevitproject.rvt'),但实际上,它实际上是一个变相的zip文件。如果将其重命名为 zip,下载并解压缩,您会发现 zip 中有很多 .RVT。

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

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

有关完整详细信息,请查看此存储库:https://github.com/wallabyway

下面是一段可以提供帮助的代码: https://github.com/wallabyway/bim360-zip-extract/blob/master/server.js#L167


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

您可以根据此处的 pkzip 信息找到神奇的 header 签名: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;
}