2015-12-02 2 views
0

Мой вариант использования такой, когда мне нужно создать каталог файлов и вернуть его в виде zip-файла для пользователя.Узел: res.download загружает пустую папку zipped

Мой код выглядит следующим образом:

var output = fs.createWriteStream('target.zip'); 

archive.pipe(output); 
archive.append('details.json', { name: 'details.json'}); 
archive.finalize(); 

//Specifiy the .zip folder & Download 
filename = 'target.zip'; 
res.download(filename); 

Это дает мне пустую папку в месте загрузки моего браузера.

target.zip, однако, содержит данные.

Я понимаю, что это происходит потому, что Node не ждет append(), чтобы добавить файлы в архив. Я попытался поместить код для загрузки в функцию обратного вызова append.finalize(), но он не работает.

Где я могу поставить код загрузки так, чтобы это произошло после успешного добавления?

+0

Пример https://github.com/archiverjs/node-archiver/blob/master/examples/pack-zip.js – Molda

+0

@Molda Пример не распространяется на загрузку клиенту - где я столкнулся с проблемой , – Ketcomp

+1

OK, но он охватывает, как видеть, когда файл был создан с помощью output.on ('close' – Molda

ответ

2

Просто взгляните на их Example на их хранилище GitHub.

Вы можете установить Attachment на res, а затем подать на него.

//set the archive name 
    res.attachment('archive-name.zip'); 

    //this is the streaming magic 
    archive.pipe(res); 

Вы должны также следить за разрешением на «close», чтобы иметь возможность завершить поток, когда все будет сделано.

res.on('close', function() { 
    console.log('Archive wrote %d bytes', archive.pointer()); 
    return res.status(200).send('OK').end(); 
    }); 

Таким образом, вы все еще можете финализировать, но загрузка будет происходить только после того, как все будет сделано.

+0

Все еще получаю пустой файл? –