我正在使用 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'))
我在这上面花了太多时间,如果有任何帮助,我将不胜感激!
我通过在服务器端添加“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
)