Coldfusion CFUPLOAD 到 S3 权限问题 - 无法查看图像
Coldfusion CFUPLOAD to S3 Permissions Issue - Can't view image
使用 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" 文件夹中。
该文件夹 "public" 具有 "ALL USERS" 的 "READ" 权限集。
但是图片上传时,并没有继承这个权限。
所以当我尝试显示图像时,它没有显示。当我在浏览器中通过 url 查看它时,它显示 xml 和消息 "AccessDenied"。
如果我手动设置 image/object 对所有用户和 运行 页面的阅读权限,或者再次查看 url,那么它就可以工作。
如何让上传的对象继承其父文件夹("public")的READ权限。或者,上传图片后如何设置上传的 image/object 的权限?
谢谢!
更新:我还添加了一个 S3 存储桶策略,它几乎完成了这项工作。
使用下面的策略,我现在可以查看上传的图片,当我右键单击图片,select "open image in new tab",我也可以正常查看。
但是,如果我复制图像的 URL 并将其粘贴到新的浏览器选项卡中并单击回车,在该特定情况下它仍然会出现 "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": "*"
}
}
}
]
}
最初您缺少完整的 S3 存储桶策略,但我们在评论中解决了这个问题。
您似乎已经使用其支持页面中的模板设置了政策。
一个严重错误 - 您填写了 Condition 子句,这意味着 Bucket 将寻找阻止请求通过的原因。在您的情况下,您指定了一个预期的引荐来源网址,这意味着任何在新选项卡中复制并粘贴直接 link 的人都会被阻止。
我怀疑您的代码现在看起来像这样,删除了您的条件:
{
"Version": "2008-10-17",
"Id": "Policy1380565312345",
"Statement": [{
"Sid": "Stmt1380565312345",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mysitedev/*"
}]
}
并且您的存储桶正在接受 public 的所有请求以查看该内容。享受吧!
使用 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" 文件夹中。
该文件夹 "public" 具有 "ALL USERS" 的 "READ" 权限集。
但是图片上传时,并没有继承这个权限。
所以当我尝试显示图像时,它没有显示。当我在浏览器中通过 url 查看它时,它显示 xml 和消息 "AccessDenied"。
如果我手动设置 image/object 对所有用户和 运行 页面的阅读权限,或者再次查看 url,那么它就可以工作。
如何让上传的对象继承其父文件夹("public")的READ权限。或者,上传图片后如何设置上传的 image/object 的权限?
谢谢!
更新:我还添加了一个 S3 存储桶策略,它几乎完成了这项工作。 使用下面的策略,我现在可以查看上传的图片,当我右键单击图片,select "open image in new tab",我也可以正常查看。
但是,如果我复制图像的 URL 并将其粘贴到新的浏览器选项卡中并单击回车,在该特定情况下它仍然会出现 "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": "*"
}
}
}
]
}
最初您缺少完整的 S3 存储桶策略,但我们在评论中解决了这个问题。
您似乎已经使用其支持页面中的模板设置了政策。
一个严重错误 - 您填写了 Condition 子句,这意味着 Bucket 将寻找阻止请求通过的原因。在您的情况下,您指定了一个预期的引荐来源网址,这意味着任何在新选项卡中复制并粘贴直接 link 的人都会被阻止。
我怀疑您的代码现在看起来像这样,删除了您的条件:
{
"Version": "2008-10-17",
"Id": "Policy1380565312345",
"Statement": [{
"Sid": "Stmt1380565312345",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mysitedev/*"
}]
}
并且您的存储桶正在接受 public 的所有请求以查看该内容。享受吧!