我试图弄清楚如何在Swift中列出AWS S3存储桶中的所有对象。我似乎无法在互联网上的任何地方找到这些信息,但也许我看起来不够努力。如果有人可以将我的代码推荐给我,那将会很棒。
答案 0 :(得分:9)
不知道你是否还需要它,但在这里你去了:
let credentialsProvider = AWSStaticCredentialsProvider(accessKey: "ACCESS KEY", secretKey: "SECRET KEY")
let configuration = AWSServiceConfiguration(region: .USWest2, credentialsProvider: credentialsProvider)
AWSS3.registerS3WithConfiguration(configuration, forKey: "defaultKey")
let s3 = AWSS3.S3ForKey("defaultKey")
let listRequest: AWSS3ListObjectsRequest = AWSS3ListObjectsRequest()
listRequest.bucket = "BUCKET"
s3.listObjects(listRequest).continueWithBlock { (task) -> AnyObject? in
print("call returned")
let listObjectsOutput = task.result;
for object in (listObjectsOutput?.contents)! {
print(object.key)
}
return nil
}
(感谢Daniel提醒我不要使用已弃用的代码);)
答案 1 :(得分:4)
Jan-Dawid的答案很棒 - 但是,如果你想让你的Bucket不向所有人公开,并且仍然可以获得对象列表,那么你必须做更多的事情(特别是在AWS设置中)才能实现这一点(参见下面你要做的事情清单......)。
或者换句话说,如何将您的存储桶设置为公开限制的Swift中列出的所有对象(如此图所示)(即无公共访问)
有一种方法可以在Swift中完成,而无需在您的应用中使用AWS用户登录设置:
创建iOS应用程序或打开要显示存储桶对象列表的应用程序:
输入以下代码:
let myIdentityPoolId = "eu-central-1:368293ad-f278-35ae-2678-6d40d48de2g5"
let credentialsProvider:AWSCognitoCredentialsProvider = AWSCognitoCredentialsProvider(regionType: .YOUR_REGION, identityPoolId: myIdentityPoolId)
let configuration = AWSServiceConfiguration(region: .YOUR_REGION, credentialsProvider:credentialsProvider)
AWSServiceManager.default().defaultServiceConfiguration = configuration
AWSS3.register(with: configuration!, forKey: "defaultKey")
let s3 = AWSS3.s3(forKey: "defaultKey")
let listRequest: AWSS3ListObjectsRequest = AWSS3ListObjectsRequest()
listRequest.bucket = "YOUR_BUCKET_NAME"
s3.listObjects(listRequest).continueWith { (task) -> AnyObject? in
for object in (task.result?.contents)! {
print("Object key = \(object.key!)")
}
return nil
}
(当然,你需要做一些化妆品来处理不应该出现任何结果的情况 - 但我会把它留给你。
确保您已导入AWSS3:
import AWSS3
之后,您需要在AWS服务页面内执行一整套步骤,以便您的代码真正检索所需的存储桶对象列表。以下是分步指导:
粗略地说,请执行以下操作:
(顺便说一句,所有这些AWS主页最好找到AWS-Services page,然后在搜索栏中输入“Cognito”或“IAM”或“S3”字样。这3个都是你需要)
但是让我们继续......
在“管理联合身份”中,创建一个新的identity pool
(即提供一个名称 - 并且不要忘记标记“启用对未经身份验证的身份的访问”(您可以查看详细信息并保留它们)保持不变) - >按允许!
Little EXTRA:如果你搞砸了什么并且想重新启动:上面的步骤Nr.6很可能不会再次使用相同的名称。在这种情况下,我建议转到“IAM”主页,同时删除连接到您的身份池的2个角色(即在IAM-main-page中的Roles下)。删除角色后,您可以重新开始创建标识池!)
第二个小额外的东西:我们在这里做的就是,请确保您所有的AWS主服务页面都在同一个区域内! (通常情况下,AWS网页的开头是https://eu-central-1。或https://us-west2等。确保它们始终保持一致!
但是让我们继续:
创建身份池后,您应该为其获取一个ID(例如:eu-central-1:368293ad-f278-35ae-2678-6d40d48de2g5
(确保您记下此ID)
在“IAM”主页中,在“角色”菜单下,您可以找到2个角色(由步骤5-8创建) - 单击Unauth中的一个(您看到有一个Auth和Unauth one)
点击Unauth后,您将进入“摘要”页面:请注意角色ARN(类似arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role
)
手头有你的身份证,请转到AWS-Policy-Generator页面。
在那里,开始填写政策生成者表格:
12a上。选择S3 Bucket Policy
作为类型
12b中。选择效果Allow
12c上。在prinicpal-field中,粘贴您在步骤10中获得的Role-ARN(类似于arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role
)
12d上。亚马逊服务字段应为Amazon S3
(取消选择标记)
12E。操作应为ListObjects
(或ListBuckets
,具体取决于您要执行的操作...)
12F。亚马逊资源名称(ARN)应为arn:aws:s3:::YOUR_BUCKET_NAME
(如果您希望存储桶中的所有文件最终都在Swift中列出,请保留空白>
12克。按添加语句按钮
12小时。按Create Policy按钮(应生成JSON文件)
类似的东西:
{
"Id": "Policy2846208763429",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt98475983711245435",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::YOUR_BUCKET_NAME",
"Principal": {
"AWS": [
"arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role"
]
}
}
]
}
使用此Policy JSON文件,返回“S3”存储桶主页
在“S3”主页中,转到 - > “Persmissions”并按“Bucket Policy”标签
替换Bucket Policy选项卡编辑器窗口中的任何内容 - 并粘贴Policy-JSON文件(从步骤12h开始)。
在设置JSON之后,请确保按“保存”
--->开始了 !! SWFIT代码现在应该在返回任务中回收所有桶文件!!!!!
如果您只想获取存储桶的对象列表,则不需要执行步骤Nr17。
<key>AWS</key>
<dict>
<key>CredentialsProvider</key>
<dict>
<key>CognitoIdentity</key>
<dict>
<key>Default</key>
<dict>
<key>PoolId</key>
<string>eu-central-1:368293ad-f278-35ae-2678-6d40d48de2g5</string>
<key>Region</key>
<string>eu-central-1</string>
</dict>
</dict>
</dict>
<key>S3TransferUtility</key>
<dict>
<key>Default</key>
<dict>
<key>Region</key>
<string>eu-central-1</string>
</dict>
</dict>
</dict>