NodeJS 如何在Google Storage Bucket中列出所有上传到存储桶的文件?

alen0pnh  于 12个月前  发布在  Node.js
关注(0)|答案(3)|浏览(132)

我有许多文件上传到谷歌云存储桶。我想对该特定桶的所有文件的名称执行操作。我如何才能实现它?

vuv7lop3

vuv7lop31#

文档展示了使用提供的节点SDK列出存储桶中所有文件的示例。您将需要使用Bucket对象的getFiles()方法。

// const bucketName = 'Name of a bucket, e.g. my-bucket';

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function listFiles() {
  // Lists files in the bucket
  const [files] = await storage.bucket(bucketName).getFiles();

  console.log('Files:');
  files.forEach(file => {
    console.log(file.name);
  });
}

listFiles().catch(console.error);

字符串

nwnhqdif

nwnhqdif2#

下面的解决方案适用于客户端。对于每个问题的Node环境,请参考Doug史蒂文森的回答
您需要使用listAll()方法来获取所有文件名。
下面是官方文档中的一个示例

// Create a reference under which you want to list
var listRef = storageRef.child('files/uid');

// Find all the prefixes and items.
listRef.listAll().then(function(res) {
  res.prefixes.forEach(function(folderRef) {
    // All the prefixes under listRef.
    // You may call listAll() recursively on them.
  });
  res.items.forEach(function(itemRef) {
    // All the items under listRef.
  });
}).catch(function(error) {
  // Uh-oh, an error occurred!
});

字符串
我建议使用list方法而不是listAll,因为后者将所有结果存储在内存中,而前者使用分页。
Cloud Storage Documentation

kmb7vmvb

kmb7vmvb3#

遇到这个线程,没有一个解决方案为我工作,我不得不使用流来获得我想要的,然后写我自己的脚本,并把它放在一个要点,以防它帮助别人。
https://gist.github.com/JonCatmull/fa55298fd55a565f246ab2e93c5c0e4b
我的脚本只是将超过一定大小的所有文件记录到一个文件中,但如果需要,您可以将它们推入一个数组中,然后对它们执行操作。

import { initializeApp } from "firebase-admin/app";
import yargs from "yargs";
import fs from "fs";
import { hideBin } from "yargs/helpers";
import { getStorage } from "firebase-admin/storage";

const argv = yargs(hideBin(process.argv))
  .option("bucket", {
    alias: "b",
    description: "bucket to copy images to",
    type: "string",
    demandOption: true,
  })
  .option("maxSizeMB", {
    alias: "m",
    description: "Max file size in MB",
    type: "number",
    demandOption: true,
  })
  .parse();

// Initialize Firebase
initializeApp({
  storageBucket: argv["bucket"],
});

function logError(msg: string, file = "large-files-error.log") {
  console.error(msg);
  return fs.promises.appendFile(file, `${msg}\n`);
}

function log(msg: string, file = "large-files.log") {
  console.log(msg);
  return fs.promises.appendFile(file, `${msg}\n`);
}

const MB = 1024 * 1024;

try {
  const run = async () => {
    const storage = getStorage();
    const bucket = storage.bucket();

    bucket
      .getFilesStream()
      .on("data", (file) => {
        const size = parseInt(file.metadata.size, 10);
        if (size > argv["maxSizeMB"] * MB) {
          log(`${file.name}
URL: https://storage.googleapis.com/${argv["bucket"]}/${file.name}
Size: ${(size / 1024 / 1024).toFixed(2)}MB
--------------------`);
        }
      })
      .on("error", (e) => {
        console.error(e);
      })
      .on("end", () => {
        console.log("done");
      });
  };
  run();
} catch (e) {
  logError(e);
}

字符串

如何设置

安装

安装gcloud https://cloud.google.com/sdk/docs/install
登录并设置项目

gcloud init
# or just authorize
gcloud auth login
# then set project to the one that contains bucket
gcloud config set project [project-name]


安装脚本依赖项

npm i ts-node firebase firebase-admin typescript yargs @types/node

运行

使用ts-node运行并传入bucket名称和最大文件大小(例如10 MB)

ts-node ./index.ts  -b your-bucket.appspot.com -m 10


将值保存到控制台,并创建一个包含路径、url和大小的large-files.log文件。

相关问题