Почему мой файл ZIP с сервера NodeJS не читается? - PullRequest
0 голосов
/ 14 июня 2019

Я создаю веб-сервис, который будет возвращать сгенерированные zip-файлы клиенту.

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

Поэтому я решил использовать XmlHttpRequest на моем клиенте для запроса ресурса и загрузки его в виде простого файла. Проблема возникает здесь, когда я генерирую загрузку с ответом сервера, zip-файл не работает.

Вот код NodeJS (с экспрессом):

.get('/myservice', function(req, res)
{
    res.setHeader('Content-Type', 'application/zip');
    const JSZip = require('jszip');

    const zip = new JSZip();
    zip.file('hello.txt', 'Hello world\n');
    zip
        .generateAsync({type: 'nodebuffer'})
        .then(function(content)
        {
            res.send(content)
        }.bind(res));
}

Вот Javascript на стороне клиента, который вызывает сервис и затем создает файл из ответа:

    var req = new XMLHttpRequest();
    req.open("GET", "https://mydomain/myservice", false);
    req.send(null);

    function download(filename, text)
    {
        var element = document.createElement('a');
        element.setAttribute('href', 'data:application/zip;charset=base64,' + text);
        element.setAttribute('download', filename);
        element.style.display = 'none';
        document.body.appendChild(element);
        element.click();
        document.body.removeChild(element);
    }

    console.log(req.responseText)
    download('test.zip', req.responseText);

Мне кажется, что я совершенно не понимаю кодировку на клиенте, но я не нашел решения.

Загруженный файл при распаковке дает мне файл, который содержит тот же zip-файл, что и то же самое.

Когда я вызываю службу с помощью XmlHttpRequest, она хорошо называется и не выдает никакой ошибки.

Я использую JSZip для генерации zip. Я точно не могу использовать blob на generateAsync из JSZip, потому что это выдает мне ошибку.

Есть решение?

1 Ответ

0 голосов
/ 14 июня 2019

Вам не нужно делать это так сложно.Как вы уже передаете файл.Просто используйте window.open('/myservice');, поскольку браузер будет обрабатывать тот факт, что это файл, и держать текущую страницу открытой и загружать файл.

https://codesandbox.io/s/hardcore-euclid-9nkft

...