我正在尝试从基于Django的网站在AWS S3上存储和检索媒体图像。当我在本地主机上时,我可以从S3中查看图像并将其保存到S3,一切都运行良好。但是,当应用程序部署并且网站在互联网上实时运行时,actual link:我只能查看S3上的图像,但无法将图像保存到S3存储桶。AWS S3存储桶具有完全的公共访问权限。尝试将图像保存到S3时出现以下错误:
错误
ClientError at /
An error occurred (400) when calling the HeadObject operation: Bad Request
字符串
它突出显示了我的代码的这一行:form_instance.保存()
我的代码:(views.py)
def make_and_see(request):
if request.method == 'POST':
form_instance = ProductForm(request.POST, request.FILES)
if form_instance.is_valid():
form_instance.save()
messages.success(request, 'Picture is saved')
return redirect('home')
else:
messages.error(request, form_instance.errors)
return redirect('home')
else:
context = {'data': Product.objects.all().order_by('?').first(), 'my_form': ProductForm(), 'time': timezone.now}
return render(request, 'app1/home.html', context)
型
(settings.py)
STORAGES = {"default": {"BACKEND": "storages.backends.s3boto3.S3Boto3Storage"},
"staticfiles": {"BACKEND": "storages.backends.s3boto3.S3StaticStorage"}}
AWS_ACCESS_KEY_ID = os.environ["MY_AWS_ACCESS_KEY_ID"]
AWS_SECRET_ACCESS_KEY = os.environ["MY_AWS_SECRET_ACCESS_KEY"]
AWS_STORAGE_BUCKET_NAME = '****'
AWS_S3_REGION_NAME = 'ap-south-1'
AWS_QUERYSTRING_AUTH = False
AWS_DEFAULT_ACL = None
AWS_S3_FILE_OVERWRITE = False
AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com"
型
我的网站通过Github托管在Vercel上,Postgresql db托管在Railway上。任何输入都会有很大的帮助,请。已尝试将AWS区域名称添加到代码中:AWS_S3_REGION_NAME,但没有任何变化。
1条答案
按热度按时间crcmnpdw1#
鉴于您可以读取图像,但不能写入图像,这意味着您的存储桶的公共访问正在工作,但客户端的权限有问题。
400状态码(客户端错误)表示请求过程中出现了错误。
为了能够写入存储桶,您需要确保设置了正确的权限。在大多数情况下,这通过AWS IAM发生,并且与访问密钥和访问秘密相关的角色或用户有关。
从上面的错误信息中,我建议几件事:
1.确保您在客户端中指定的区域与您制作存储桶的区域相似
1.验证属于该访问密钥和访问密码的角色/用户的IAM权限。
1.确保您的访问密钥和访问密码没有过期。可能是你用了短命的证书
1.确保您正在尝试写入正确的路径(bucket)