Создание zip с использованием экспресс и архиватора - PullRequest
0 голосов
/ 05 марта 2019

Я использовал нод-архиватор для архивирования файлов следующим образом.Но я получаю поврежденный zip-файл.

app.get('/download', async (req, res) => {

    const arch = archiver('zip');
    arch.append('abc', { name: 'abc.txt'});
    arch.append('cdf', { name: 'cdf.txt'});

    res.attachment('test.zip').type('zip');
    arch.pipe(res);
    arch.finalize();
});

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

app.get('/download', async (req, res) => {


    const arch = archiver('zip');
    arch.append('abc', { name: 'abc.txt'});
    arch.append('cdf', { name: 'cdf.txt'});

    const output = fs.createWriteStream('./test.zip');
    arch.pipe(output);
    arch.finalize();
});

Почему zip-файл повреждается при отправке через экспресс-объект res?Что бы исправить?

Редактировать: Если я использую выходной формат как tar вместо zip, он работает без проблем.

const arch = archiver('tar');

1 Ответ

0 голосов
/ 06 марта 2019

Я думаю, вам нужно закрыть поток ответов:

app.get('/download', async (req, res) => {

    const arch = archiver('zip');
    arch.append('abc', { name: 'abc.txt'});
    arch.append('cdf', { name: 'cdf.txt'});

    res.attachment('test.zip').type('zip');
    arch.on('end', () => res.end()); // end response when archive stream ends
    arch.pipe(res);
    arch.finalize();
});
...