在我的项目中,我有一个项目表。对于每个项目,都有一个用于下载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)
});
}
答案 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 file
、Read a RAR file
和 Extract 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);
}