我正在使用AWS sdk for javascript,我试图列出所有键以特定字符串结尾的对象(例如:mp4)使用listObjects,我发现了一个指定前缀的选项,但没有指定后缀。
v7pvogib1#
S3不支持通过后缀的对象键列表。你所能做的就是在你的Node.js应用程序中获取所有内容的列表和过滤器。试试这样的东西:
const res = await s3.listObjectsV2({ Bucket: 'bucket' }).promise(); const items = res.Contents.filter(item => item.Key.endsWith('mp4'));
ct2axkht2#
最简单的方法是请求所有对象,然后在代码中过滤结果。
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存储桶中有以下文件结构
string.endsWith
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文件,而不过滤较低级别的文件,如下所示
.js
import lib from './your-lib-file.js' const res = lib.listObjectsWithSuffix('MyBucket', 'assets/', /^assets\/[^/]+\.js/)
3条答案
按热度按时间v7pvogib1#
S3不支持通过后缀的对象键列表。你所能做的就是在你的Node.js应用程序中获取所有内容的列表和过滤器。
试试这样的东西:
ct2axkht2#
最简单的方法是请求所有对象,然后在代码中过滤结果。
b4qexyjb3#
1.使用所需前缀列出Bucket的内容
1.过滤结果并将其推送到稍后返回的列表中
1.检查来自S3的响应是否被截断,这意味着存在更多文件
1.如果它被截断,则循环传递NextContinuationToken的进程
1.返回累积结果。
https://gist.github.com/danielsan/935fc05afb155d4c32791017408adb3b
我故意在常量的名称中添加了很多my前缀,因为从StackOverflow复制的代码不能在任何地方不加修改地使用,所以你可以继续删除所有这些my前缀,这将是一个非常不同的代码。
使用aws-sdk v2
使用aws-sdk-v3
我之所以选择使用正则表达式而不是
string.endsWith
方法,是因为它给了你更多的灵活性。例如,假设您的s3存储桶中有以下文件结构
例如,regexp将给予您仅过滤assets文件夹下的
.js
文件,而不过滤较低级别的文件,如下所示