通过 put getting forbidden 403 获取预签名的 url 到 s3

问题描述 投票:0回答:1

我正在使用 Amazon S3 存储图像,并正在生成一个预签名的 URL 来上传它们。当我使用 Python 使用预签名 URL 上传图像时,它可以正常工作。但是,当我尝试使用 JavaScript(作为 React 应用程序的一部分)执行相同操作时,出现 403 Forbidden 错误。

相关代码如下:

// input-file (saved into img state var)
<input id="id_img1" type="file" accept="image/*"
        onChange={(e) => {setImg(e.target.files[0]);}} />

// on submit:
const fd = new FormData()
fd.append('File', img)

options = {
    method: 'put',
    body: fd,
}
res = await fetch(psurl, options)

我读到在请求中添加 Content-Type 标头可能会有所帮助,但是当我尝试时,它并没有解决问题。

我还尝试将图像设置为正文:

body: img
// or
body: img["file"]

仍然没有成功。

预签名 URL 有效,我可以使用 Python 将图像上传到同一个 S3 存储桶,但不能使用 JavaScript。什么可能导致 403 Forbidden 错误,我该如何解决?

我用的python代码是:

requests.put(url=psurl, data=open(image_path, 'rb'))

我在这上面花了太多时间,如果有任何帮助,我将不胜感激!

amazon-s3 put pre-signed-url
1个回答
0
投票

我通过在服务器端添加“ContentType”成功解决了这个问题。

response = s3_client.generate_presigned_url(
        'put_object',
        Params={
            'Bucket': bucket_name,
            'Key': object_key,
            'ContentLength': max_size,
            'ContentType': "image/jpeg",   // I added this
        },
        ExpiresIn=expiration
    )
© www.soinside.com 2019 - 2024. All rights reserved.