Загрузка с помощью узла изменяет файлы Excel и приводит к потере данных - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь создать скрипт в node.js, который будет загружать файл Excel. Мой код основан на том, что сначала я сделал запрос http.get к URL, а затем записал в файл, используя 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 из-за этого проблема с именем файла, содержащим , в имени файла. Поэтому я не могу использовать кукловодов для этого.

Однако, если я использую свой скрипт выше, загружаю файл и пытаюсь открыть его в excel, это выдает мне сообщение о том, что «данные могут быть потеряны» 5 раз, но затем в конечном итоге по-прежнему открывает файл.

File error: data may have been lost error

Поэтому у меня вопрос: что вызывает эту потерю данных при загрузке с использованием nodejs?

Update

Некоторые данные о версиях:

  • Узел: v12.13.1
  • Excel: Office 2019
  • ОС: Windows 10 последние

Обновление 2

Основываясь на комментариях ниже от jarmod, я попытался использовать wget на Windows PowerShell. Он также загружает файл, но также выдает ошибку Excel.

1 Ответ

0 голосов
/ 18 апреля 2020

Я опубликовал это как проблему на node.js github . @ Hakerh400 предоставил хорошее описание того, что там происходит, но вкратце, в файловой системе Windows NTFS есть нечто, называемое ADS (альтернативные потоки данных), которое отслеживает, какие файлы загружаются из inte rnet, чтобы вызвать проблемы безопасности. , Подробнее об этом можно прочитать в комментарии @ 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). Тем не менее, нет реальной потери данных с точки зрения листов / данных в ячейках.

Я надеюсь, что этот ответ поможет любому, кто сталкивается с чем-либо подобным.

...