使用Node.js存档器下载多个Google云存储文件并将其压缩

时间:2019-02-25 15:08:46

标签: node.js google-cloud-storage

我正在尝试从Google云存储下载文件并压缩它们。

async function makeZippedFiles(destination, all_file_links) {

console.log("In the zip file function");


for (let i in all_file_links) {
    let name = all_file_links[i]['name']
    let archive = archiver('zip', {
        zlib: {level: 9} // Sets the compression level.
    });


    archive.on('error', function (err) {
        throw err;
    });

    let output = fs.createWriteStream(__dirname + `/${name}.zip`);


    console.log("loop number", i);

    let sourceFile = all_file_links[i]['source'];

    console.log(sourceFile, name);

    let remoteFile = bucket.file(sourceFile);

    let read_file = remoteFile.createReadStream();

    await archive.append(read_file, {name: name});

    read_file
        .on('error', function (err) {
            console.log(err);
        })
        .on('response', function (response) {
            console.log("writing file", name);
            //  console.log(response);
            // Server connected and responded with the specified status and headers.
        })
        .on('end', function () {
            console.log("file downloaded", name);
            // The file is fully downloaded.
        })


    archive.pipe(output);

    archive.finalize();
}


}

在上面的示例中,我遍历所有文件并创建单个存档。即,如果我下载两个文件,则将创建两个单独的档案。这可行。

但是,如果我要将所有文件压缩到一个存档中,则会出现以下错误:

  

找不到中央目录的开始; zip文件已损坏。 (请   检查您是否已在
中传输或创建了zipfile   适当的BINARY模式,并且您已正确编译了UnZip)

我使用的代码是:

async function makeZippedFiles(destination, all_file_links) {
    console.log("In the zip file function");
    let archive = archiver('zip', {
        zlib: {level: 9} // Sets the compression level.
    });

archive.on('error', function (err) {
    throw err;
});

let output = fs.createWriteStream(__dirname + `/${destination}.zip`);


for (let i in all_file_links) {
    let name = all_file_links[i]['name']

    console.log("loop number", i);

    let sourceFile = all_file_links[i]['source'];

    console.log(sourceFile, name);

    let remoteFile = bucket.file(sourceFile);

    let read_file = remoteFile.createReadStream();

    await archive.append(read_file, {name: name});

    read_file
        .on('error', function (err) {
            console.log(err);
        })
        .on('response', function (response) {
            console.log("writing file", name);
            //  console.log(response);
            // Server connected and responded with the specified status and headers.
        })
        .on('end', function () {
            console.log("file downloaded", name);
            // The file is fully downloaded.
        })


    archive.pipe(output);

}

archive.finalize();



}

1 个答案:

答案 0 :(得分:0)

找到了解决方案。实际上是粗心。

async function makeZippedFiles(destination, all_file_links) {
    console.log("In the zip file function");
    let archive = archiver('zip', {
        zlib: {level: 9} // Sets the compression level.
    });

archive.on('error', function (err) {
    throw err;
});

let output = fs.createWriteStream(__dirname + `/${destination}.zip`);

archive.pipe(output);


for (let i in all_file_links) {
    let name = all_file_links[i]['name']

    console.log("loop number", i);

    let sourceFile = all_file_links[i]['source'];

    console.log(sourceFile, name);

    let remoteFile = bucket.file(sourceFile);

    let read_file = remoteFile.createReadStream();

    await archive.append(read_file, {name: name});

    read_file
        .on('error', function (err) {
            console.log(err);
        })
        .on('response', function (response) {
            console.log("writing file", name);
            //  console.log(response);
            // Server connected and responded with the specified status and headers.
        })
        .on('end', function () {
            console.log("file downloaded", name);
            // The file is fully downloaded.
        })



}

archive.finalize();

}

我将archive.pipe(output)移到了for循环之前,并且可以正常工作。