Я создаю веб-сервис, который будет возвращать сгенерированные 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, потому что это выдает мне ошибку.
Есть решение?