NodeJS 如何在AWS S3中使用后缀列出对象

mjqavswn  于 2023-06-05  发布在  Node.js
关注(0)|答案(3)|浏览(387)

我正在使用AWS sdk for javascript,我试图列出所有键以特定字符串结尾的对象(例如:mp4)
使用listObjects,我发现了一个指定前缀的选项,但没有指定后缀。

v7pvogib

v7pvogib1#

S3不支持通过后缀的对象键列表。你所能做的就是在你的Node.js应用程序中获取所有内容的列表和过滤器。
试试这样的东西:

const res = await s3.listObjectsV2({
  Bucket: 'bucket'
}).promise();

const items = res.Contents.filter(item => item.Key.endsWith('mp4'));
ct2axkht

ct2axkht2#

最简单的方法是请求所有对象,然后在代码中过滤结果。

b4qexyjb

b4qexyjb3#

1.使用所需前缀列出Bucket的内容
1.过滤结果并将其推送到稍后返回的列表中
1.检查来自S3的响应是否被截断,这意味着存在更多文件
1.如果它被截断,则循环传递NextContinuationToken的进程
1.返回累积结果。
https://gist.github.com/danielsan/935fc05afb155d4c32791017408adb3b
我故意在常量的名称中添加了很多my前缀,因为从StackOverflow复制的代码不能在任何地方不加修改地使用,所以你可以继续删除所有这些my前缀,这将是一个非常不同的代码。
使用aws-sdk v2

// https://gist.github.com/danielsan/935fc05afb155d4c32791017408adb3b
import S3 from 'aws-sdk/clients/s3.js'

export const s3 = new S3()

const myFilterContents = (s3Response, pattern) => s3Response.Contents.filter(s3Object => pattern.test(s3Object.Key))

export async function listObjectsWithSuffix (Bucket, Prefix, pattern) {
  let myResults = []
  let myS3Response

  const myS3ListParams = {
    Bucket,
    Prefix,
    MaxKeys: 1000,
    ContinuationToken: undefined
  }

  do {
    myS3Response = await s3.listObjectsV2(myS3ListParams).promise()
    myResults = myResults.concat(myFilterContents(myS3Response, pattern))
    myS3ListParams.ContinuationToken = myS3Response.NextContinuationToken
  } while (myS3Response.IsTruncated === true)

  return myResults
}

使用aws-sdk-v3

// npm i @aws-sdk/client-s3
// https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/preview/client/s3/command/ListObjectsV2Command/
import { S3Client, ListObjectsV2Command } from "@aws-sdk/client-s3"

const myS3Client = new S3Client();

const myFilterContents = ({ Contents: c }, pattern) => c.filter(s3Object => pattern.test(s3Object.Key))

export async function listObjectsWithSuffix (Bucket, Prefix, myPattern) {
  let myResults = []
  let myS3Response

  const myS3ListParams = {
    Bucket,
    Prefix,
    MaxKeys: 1000,
    ContinuationToken: undefined
  }

  do {
    myS3Response = await myS3Client.send(new ListObjectsV2Command(myS3ListParams))
    myResults = myResults.concat(myFilterContents(myS3Response, myPattern))
    myS3ListParams.ContinuationToken = myS3Response.NextContinuationToken
  } while (myS3Response.IsTruncated === true)

  return myResults
}

我之所以选择使用正则表达式而不是string.endsWith方法,是因为它给了你更多的灵活性。
例如,假设您的s3存储桶中有以下文件结构

index.html
index.js
assets/
a.js
a/
    a1.js
    a2.js
    a3.js
b.js
b/
    b1.js
    b2.js
    b3.js
c.js
c/
    c1.js
    c2.js
    c3.js

例如,regexp将给予您仅过滤assets文件夹下的.js文件,而不过滤较低级别的文件,如下所示

import lib from './your-lib-file.js'

const res = lib.listObjectsWithSuffix('MyBucket', 'assets/', /^assets\/[^/]+\.js/)

相关问题