当前位置: 首页 > 知识库问答 >
问题:

无法访问保存在Javascript代码桶中的图像

汪正卿
2023-03-14

我有一个django项目,可以将文件上传到AWS S3 bucket。例如,如果使用{%static%}标记在模板中呈现上传的文件和静态文件,则会正确显示它们。但是,当我想使用model_对象访问javascript代码中的图像时。形象url,图像不会显示。我检查了代码,获取了js代码中呈现的url,并将其粘贴到浏览器上,它给出了以下错误:

<Error>
<Code>AccessDenied</Code>
<Message>Query-string authentication requires the Signature, Expires and AWSAccessKeyId parameters</Message>
<RequestId>xxxx</RequestId><HostId>xxx</HostId>
</Error>

更多有用的信息:

用户上传一张图片,然后他可以裁剪图片。我使用Croppie,它是一个js库,使用图像的url,如下所示:

$('.div').croppie({
    url: '{{ model_object.image.url }}',
});

一切都在本地工作。这是AWS的一个问题,我显然不明白。

下面的solaris烟雾注释,我添加了这个桶策略到我的桶:

{
    "Version": "2012-10-17",
    "Id": "Policy1468082822770",
    "Statement": [
        {
            "Sid": "Stmt1468082812651",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::criptolibertad/*"
        }
    ]
}

然而,它仍然不起作用。我注意到在不起作用的模板中呈现的url看起来像这样:

https://criptolibertad.s3.amazonaws.com/Django/0_squashmigrations.jpeg?Signature=HFDdOYvrfqz5DG...

如果我直接从我的桶打开资源,url看起来像这样:

https://s3-us-west-2.amazonaws.com/criptolibertad/Django/0_squash迁移。jpeg?X-Amz-Date=201607。。。

我也右键点击文件夹,选择了公开以防万一。

任何建议都会有帮助。

共有2个答案

公孙联
2023-03-14

好的,多亏了图图达贾霍和他在这个问题上的回答,我缩小了问题的范围,找到了问题和解决方案:

克洛皮。js试图将图像加载到HTML5画布中。克洛皮。js自动将crossorigin=“anonymous”添加到图像中。但图像缺少正确的CORS标题,因此画布被“污染”。

我发现了换短裙。js source和removingcrossorigin=“anonymous”起到了部分作用:图像已正确加载到画布中,但无法导出它并获得我需要发送到服务器的base64图像。

真正的解决方案是改变我的bucket CORS配置,如下所示:

为此:

顺便说一句。AWS留档不清楚AlloweHeader选项。

宦砚
2023-03-14

首先,上面的链接指向不同的路径,一个是文件Django/0_squashmigrations.jpeg另一个是Django/0_squashmigrations.jpeg。后者是一个不为我工作,它似乎缺少一个字符(空间?);我根本无法访问那个文件(我得到一个访问错误)。我想那只是你的一个打字错误。

由于熟悉你的代码(如果你想修改链接,请告诉我),我模拟了图像上传,甚至将你的策略复制到了我的bucket中。

我注意到我的model_objecct.image.url与您的不同之处在于它包括AWSAccessKeyId如下:

> fs = FeralSpirit.objects.all()[1]
> print(fs.imagen.url)
https://so38134984.s3.amazonaws.com/OrillaLibertaria/Users/pavel/dev/temp/so38134984/rainbow_dash2.png?Signature=****&Expires=*****&AWSAccessKeyId=*******

示例中的链接只包含签名,因此您看到的错误消息非常合适。

事实上,我们可以访问上面的图像,而不需要任何查询字符串。

如果您试图删除查询字符串参数,因为这将是一个可公开访问的bucket,请尝试向Django设置中添加AWS\u QUERYSTRING\u AUTH=False。这将生成不带任何查询字符串参数的url:

> fs = FeralSpirit.objects.all()[1]
> fs.imagen.url
'https://so38134984.s3.amazonaws.com/OrillaLibertaria/Users/pavel/dev/temp/so38134984/rainbow_dash2.png'

当然,这仍然是公开的。

 类似资料:
  • 问题内容: 我不明白“无法​​访问的代码”是什么意思? 在我的代码的最后一行中,它表示无法访问的代码。 } 问题答案: 这里的循环: 解析为,因为从未修改过的值。因此,(在您的情况下)之后出现的任何代码均被视为 无法访问 。

  • 我有一个只能使用签名url访问的S3存储桶。到目前为止,我使用GeneratePresignedUrlRequest(Java)生成签名url。现在我想通过CloudFront访问我的存储桶。问题是我如何在这种情况下生成签名url?

  • 我已启动 EC2 - Windows 实例 创建了一个 S3 存储桶,创建了一个角色 S3 完整访问并分配给 EC2 实例。 从EC2实例浏览器中,我能够访问我的角色的元数据:http://169.254.169.254/latest/meta-data/iam/security-credentials/EC2-S3-access 如果我尝试从S3 bucket访问文件:https://s3.ap

  • 问题内容: 有时,当您调试时,会有无法访问的代码片段。无论如何,有没有抑制警告? 问题答案: 在任何编译器上执行此操作的唯一方法是。 如果您使用的是Eclipse,请尝试。

  • 问题内容: 我在Eclipse中尝试了以下方法: :警告“死代码” :编译错误“无法访问的代码” 我想知道这种差异是否存在真正的“原因”。我已经找到了… …但是为什么不允许相同的调试目的? 问题答案: 在上可达代码JLS部分解释了理由。本质上,Java通常不应该像C常规那样使用条件编译,但是在某些情况下(例如调试,尤其是向后二进制兼容性),需要允许编译器完全剥离代码,因此特定的结构为此被允许。

  • 我在Eclipse中尝试了以下操作: :警告“死码” while(false){}:编译错误“无法访问代码” 我想知道这种差异是否有真正的“原因”。我已经找到这个。。。 无法访问的代码编译器错误 ...但是为什么不允许用于相同的调试目的呢?