【问题标题】:Downloading with node modifies excel files and causes data loss用node下载修改excel文件导致数据丢失
【发布时间】:2020-07-31 12:34:30
【问题描述】:

我正在尝试在 node.js 中创建一个脚本,它将下载一个 excel 文件。我的代码建立在首先向 URL 发出 http.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

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

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

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

更新

关于版本的一些数据:

  • 节点:v12.13.1
  • Excel:Office 2019
  • 操作系统:Windows 10 最新版

更新 2

基于 jarmod 下面的 cmets,我尝试在 Windows PowerShell 上使用 wget。它也会下载文件,但也会产生 excel 错误。

【问题讨论】:

  • 如果使用 wget 或 curl 检索文件,Excel 中会发生什么?
  • 我不确定。我没试过那些。也不知道怎么试。但我需要在节点中执行此操作。这些有节点模块吗?
  • 它们是 Mac 和 Linux 的命令行程序。您可能也可以找到 Windows 版本。关键是使用受信任的工具(如 curl 或 wget)验证文件下载。
  • 我尝试使用 Powershell 的 wget 并得到 200 OK 响应。我设法保存文件并打开它,但它也给了我 excel 错误。
  • 同样的错误?所以听起来问题不在于您的 Node 脚本。它是提供文件的端点。当我点击它时,我得到一个 ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION 报告,表明服务器行为不端。

标签: node.js fs


【解决方案1】:

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

建议的解决方法是使用以下示例在下载完成后将此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)。但是,就单元格中的表格/数据而言,并没有真正的数据丢失。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多