node.js - 用node下载修改excel文件导致数据丢失
问题描述
我正在尝试在 node.js 中创建一个脚本,它将下载一个 excel 文件。我的代码建立在首先向 URL 发出请求,然后使用andhttp.get
写入文件的基础上。我的代码如下:response.pipe
createWriteStream
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 下载时导致此数据丢失的原因是什么?
更新
关于版本的一些数据:
- 节点:v12.13.1
- Excel:Office 2019
- 操作系统:Windows 10 最新
更新 2
根据 jarmod 的以下评论,我尝试在 Windows PowerShell 上使用 wget。它也下载文件,但也会产生 excel 错误。
解决方案
我将此作为问题发布在 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)。但是,就单元格中的表格/数据而言,并没有真正的数据丢失。
我希望这个答案可以帮助任何面临类似情况的人。
推荐阅读
- angular - 在Angular 7中只为ngFor刷新一项
- python - 使用 pandas resample 将特定列排除在重新采样之外
- angular - 服务调用Angular 6时页面卡住了
- c# - 从 MP4 视频创建缩略图在共享主机上崩溃,但在本地工作正常
- vue.js - 问题:构建我的 vue 项目需要很长时间
- node.js - Angular 应用程序文件上传
- kubernetes - 为什么 Kubernetes 调度程序忽略 nodeAffinity?
- c# - 初级开发(起步)指导:DTO 和创建对象
- java - java中数组的最大元素数
- html - 身高为父母身高50%的孩子(身高未知)