Как преобразовать файлы в файл .RAR - PullRequest
0 голосов
/ 29 мая 2018

В моем проекте у меня есть таблица проектов.Для каждого проекта есть колонка для скачивания pdf файла.Теперь я хочу иметь возможность загружать все файлы и создавать один файл .rar.Существует код для загрузки одного файла:

rout.js

app.get('/api/download/archive/:filename', function(req,res){
    res.download("public/uploads/"+req.params.filename, req.params.filename);
}) 

archive.js

$scope.downloadPdf = function(obj){
    $http.get('api/download/archive/'+obj.Documentation)
    .success(function(data){
        window.open('api/download/archive/'+obj.Documentation)
    });
}

1 Ответ

0 голосов
/ 30 мая 2018

К сожалению, RAR - это программное обеспечение с закрытым исходным кодом.Таким образом, единственный способ создать архив - это установить утилиту командной строки с именем rar и затем использовать команду rar a в дочернем процессе для сжатия файлов.

Для установки rar на Mac Iпришлось бежать brew install homebrew/cask/rar.Вы можете найти инструкции по установке для других платформ здесь .

После установки вы можете использовать child_process следующим образом:

const { exec } = require('child_process');
const { promisify } = require('util');
const fs = require('fs');
const path = require('path');

// Promisify `unlink` and `exec` functions as by default they accept callbacks
const unlinkAsync = promisify(fs.unlink);
const execAsync = promisify(exec);

(async () => {
    // Generating a different name each time to avoid any possible collisions
    const archiveFileName = `temp-archive-${(new Date()).getTime()}.rar`;
    // The files that are going to be compressed.
    const filePattern = `*.jpg`;

    // Using a `rar` utility in a separate process
    await execAsync(`rar a ${archiveFileName} ${filePattern}`);

    // If no error thrown the archive has been created
    console.log('Archive has been successfully created');

    // Now we can allow downloading it

    // Delete the archive when it's not needed anymore
    // await unlinkAsync(path.join(__dirname, archiveFileName));

    console.log('Deleted an archive');
})();

Чтобы запустить пример, поместите несколько файлов .jpg в каталог проекта.

PS: Если вы выбрали другой формат архива (например,.zip) вы сможете использовать что-то вроде archiver например.Это может позволить вам создать поток zip и направить его на ответ напрямую.Таким образом, вам не нужно создавать какие-либо файлы на диске.Но это другой вопрос.

...