【发布时间】:2018-01-17 16:00:06
【问题描述】:
使用 Coldfusion,我成功地将图像上传到 Amazon S3 存储桶和文件夹。我可以确认该文件在那里。这是代码:
<cfparam name="attributes.bSubmit" default="" />
<cfif Trim(attributes.bSubmit) NEQ "">
<cfset local.filePath = "#application.Config.cdnDirAbs#/public/" />
<cffile action="upload" filefield="tFile" destination="#local.filePath#" nameconflict="makeunique" charset="utf-8" />
<cfoutput>DONE UPLOAD</cfoutput>
<cfoutput>
<img src="#application.Config.staticContentDirAbs#/public/#cffile.clientfile#">
</cfoutput>
</cfif>
<form method="post" enctype="multipart/form-data">
Select a File
<input type="file" name="tFile" />
<input type="submit" value="Submit" name="bSubmit" />
</form>
如您所见,我正在将图像文件上传到我的 Amazon S3 存储桶的“公共”文件夹。
该文件夹“public”,为“ALL USERS”设置了“READ”权限。
但是,图片上传的时候,并没有继承这个权限。
所以当我尝试显示图像时,它不会显示。当我通过它的 url 在浏览器中查看它时,它会显示带有消息“AccessDenied”的 xml。
如果我手动将该图像/对象的权限设置为 READ for ALL USERS 并运行该页面,或者再次查看该 url,那么它可以工作。
如何让上传的对象继承其父文件夹(“公共”)的读取权限。或者,上传图片后如何设置上传图片/对象的权限?
谢谢!
更新:我还添加了一个 S3 存储桶策略,它几乎完成了这项工作。 使用下面的策略,我现在可以查看上传的图片,当我右键单击图片,选择“在新标签页中打开图片”时,我也可以正常查看。
但是,如果我复制图像的 URL 并将其粘贴到新的浏览器选项卡中并单击 Enter,则在该特定情况下仍会出现“ACCESSDENIED”错误。这很奇怪。任何想法为什么?
{
"Version": "2008-10-17",
"Id": "Policy1380565312345",
"Statement": [
{
"Sid": "Stmt1380565312345",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mysitedev/*",
"Condition": {
"StringLike": {
"aws:Referer": "*"
}
}
}
]
}
【问题讨论】:
-
小问题,你写过桶策略吗?它是一个简短的 JSON 字符串,为存储桶提供默认权限。
-
@TRose:我有,并且已经用细节更新了这个问题。谢谢!
-
您不应该填写“条件”部分。该文件不会在全新选项卡中打开的原因是因为它没有引荐来源。如果您希望这些内容公开,则不需要它。
-
@TRose:太好了。我删除了条件子句并解决了该问题!非常感谢。如果您想在下面发布解决方案的副本作为回复,我很乐意将其标记为已接受的答案!
-
我大多只是用棍子戳你的代码,但我很乐意接受这个提议。
标签: amazon-s3 coldfusion