首页 > 解决方案 > 用node下载修改excel文件导致数据丢失

问题描述

我正在尝试在 node.js 中创建一个脚本,它将下载一个 excel 文件。我的代码建立在首先向 URL 发出请求,然后使用andhttp.get写入文件的基础上。我的代码如下:response.pipecreateWriteStream

const fs = require("fs");
const http = require("http");

let url = "http://www.functionalglycomics.org:80/glycomics/HFileServlet?operation=downloadRawFile&fileType=DAT&sideMenu=no&objId=1002183";

http.get(url, response => {
  let file = fs.createWriteStream('file.xls');
  let stream = response.pipe(file);
})

如果您使用 Firefox 下载以下文件,则该文件会正确下载,并且如果您打开该文件,它可以正常工作,并且 Excel 不会给出任何错误。 http://www.functionalglycomics.org:80/glycomics/HFileServlet?operation=downloadRawFile&fileType=DAT&sideMenu=no&objId=1002183

注意 - 由于文件名中包含的文件名存在问题,因此上述下载链接不适用于 Chrome ,。因此我不能为此使用 puppeteer。

但是,如果我使用上面的脚本并下载文件并尝试在 excel 中打开它,它会给我一个错误,指出“数据可能已丢失”5 次,但最终仍会打开文件。

文件错误:数据可能已丢失错误

因此,我的问题是,使用 nodejs 下载时导致此数据丢失的原因是什么?

更新

关于版本的一些数据:

更新 2

根据 jarmod 的以下评论,我尝试在 Windows PowerShell 上使用 wget。它也下载文件,但也会产生 excel 错误。

标签: node.jsfs

解决方案


我将此作为问题发布在 node.js github 上。@Hakerh400 很好地描述了那里发生的事情,但简要地说,在 Windows NTFS 文件系统上,有一个称为 ADS(备用数据流)的东西,它跟踪从 Internet 下载的文件以提示安全问题。您可以在此处的@Hakerh400 评论中阅读更多相关信息。

建议的解决方法是Zone.Identifier在下载完成后使用以下示例将此 ADS 添加到文件中:

http.get(url, response => {
  let file = fs.createWriteStream('file.xls');
  let stream = response.pipe(file);
  fs.writeFileSync(
    'file.xls:Zone.Identifier',
    `[ZoneTransfer]\r\nZoneId=3\r\nHostUrl=${url}`,
  );
})

注意 - 此解决方法允许您在“受保护的视图”中打开 Excel 文件而无需担心。但是,如果您在 Excel 的安全提示中单击“启用编辑”,仍然会弹出“文件错误:数据可能已丢失”错误(Excel 2019)。但是,就单元格中的表格/数据而言,并没有真正的数据丢失。

我希望这个答案可以帮助任何面临类似情况的人。


推荐阅读