【发布时间】:2020-07-31 12:34:30
【问题描述】:
我正在尝试在 node.js 中创建一个脚本,它将下载一个 excel 文件。我的代码建立在首先向 URL 发出 http.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
注意 - 由于文件名中包含 , 的文件名存在 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 报告,表明服务器行为不端。