如何将文件转换为.RAR文件节点js

时间:2018-05-29 10:26:47

标签: angularjs node.js rar

在我的项目中,我有一个项目表。对于每个项目,都有一个用于下载pdf文件的列。现在我希望能够下载所有文件并创建单个.rar文件。有一个用于下载单个文件的代码:

routes.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)
    });
}

2 个答案:

答案 0 :(得分:1)

不幸的是,RAR是一个闭源软件。因此,创建存档的唯一方法是安装名为rar的命令行实用程序,然后在子进程中使用rar a命令来压缩文件。

要在Mac上安装rar,我必须运行brew install homebrew/cask/rar。您可以找到其他平台here的安装说明。

安装后,您可以使用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流并将其管道直接响应。因此,您不需要在磁盘上创建任何文件。 但这是一个不同的问题。

答案 1 :(得分:0)

试试WinrarJs
该项目允许您Create a RAR fileRead a RAR fileExtract a RAR archive

以下是来自 GitHub 的示例:

/* Create a RAR file */

var winrar = new Winrar('/path/to/file/test.txt');
// add more files
winrar.addFile('/path/to/file/test2.txt');
// add multiple files
winrar.addFile(['/path/to/file/test3.txt', '/path/to/file/test4.txt']);

// set output file
winrar.setOutput('/path/to/output/output.rar');

// set options
winrar.setConfig({
    password: 'testPassword',
    comment: 'rar comment',
    volumes: '10',  // split volumes in Mega Byte
    deleteAfter: false, // delete file after rar process completed
    level: 0 // compression level 0 - 5
});

// archiving file
winrar.rar().then((result) => {
    console.log(result);
}).catch((err) => {
    console.log(err);
}