47 lines
1.4 KiB
JavaScript
47 lines
1.4 KiB
JavaScript
/**
|
|
* @fileoverview Google Cloud Storage (GCS) download module.
|
|
*/
|
|
const { Storage } = require('@google-cloud/storage');
|
|
const archiver = require('archiver');
|
|
const KEY_FILE_PATH = './keys/service-account.json'
|
|
const storage = new Storage({
|
|
keyFilename: KEY_FILE_PATH});
|
|
|
|
// Load environment variables
|
|
require('dotenv').config();
|
|
|
|
// バケット名を.envから取得する
|
|
const BUCKET_NAME = process.env.BUCKET_NAME;
|
|
console.log(`BUCKET_NAME: ${BUCKET_NAME}`);
|
|
|
|
|
|
/**
|
|
* GCStorageからファイルをダウンロードする
|
|
*
|
|
* @param {http.IncomingMessage} req
|
|
* @param {http.ServerResponse} res
|
|
*/
|
|
const downloadFilesFromGCS = async (req, res) => {
|
|
// バケットからファイル一覧を取得する
|
|
const [files] = await storage.bucket(BUCKET_NAME).getFiles();
|
|
const filesToZip = files.map((file) => file.name);
|
|
|
|
res.setHeader('Content-Disposition', 'attachment; filename="files.zip"');
|
|
res.setHeader('Content-Type', 'application/zip');
|
|
|
|
const archive = archiver('zip', { zlib: { level: 9 } });
|
|
|
|
archive.on('error', (err) => res.status(500).send({ error: err.message }));
|
|
archive.pipe(res);
|
|
|
|
|
|
for (const fileName of filesToZip) {
|
|
const file = storage.bucket(BUCKET_NAME).file(fileName);
|
|
archive.append(file.createReadStream(), { name: fileName });
|
|
}
|
|
archive.finalize();
|
|
};
|
|
|
|
|
|
module.exports = downloadFilesFromGCS;
|