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 的所有请求以查看该内容。享受吧!