【问题标题】:Coldfusion CFUPLOAD to S3 Permissions Issue - Can't view imageColdfusion CFUPLOAD 到 S3 权限问题 - 无法查看图像
【发布时间】: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


【解决方案1】:

最初,您缺少完整的 S3 存储桶策略,但我们在 cmets 中对其进行了哈希处理。

您似乎已经使用他们支持页面中的模板设置了策略。

一个严重错误 - 您填写了 Condition 子句,这意味着 Bucket 将寻找阻止请求通过的原因。在您的情况下,您指定了预期的引荐来源网址,这意味着在新标签中复制并粘贴直接链接的任何人都将被阻止。

我怀疑你的代码现在看起来像这样,删除了你的条件:

{
    "Version": "2008-10-17",
    "Id": "Policy1380565312345",
    "Statement": [{
        "Sid": "Stmt1380565312345",
        "Effect": "Allow",
        "Principal": {
            "AWS": "*"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::mysitedev/*"
    }]
}

并且您的存储桶正在接受公众提出的所有查看该内容的请求。享受吧!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2017-09-08
    • 2019-10-16
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    相关资源
    最近更新 更多