我正在保存一个桶的密钥:
key = bucket.new_key(fileName)
key.set_contents_from_string(base64.b64decode(data))
key.set_metadata('Content-Type', 'image/jpeg')
key.set_acl('public-read')
Run Code Online (Sandbox Code Playgroud)
保存成功后,如何访问新创建的文件的URL?
我试图使用Boto3将文件上传到s3并将上传的文件公开并将其作为网址返回.
class UtilResource(BaseZMPResource):
class Meta(BaseZMPResource.Meta):
queryset = Configuration.objects.none()
resource_name = 'util_resource'
allowed_methods = ['get']
def post_list(self, request, **kwargs):
fileToUpload = request.FILES
# write code to upload to amazone s3
# see: https://boto3.readthedocs.org/en/latest/reference/services/s3.html
self.session = Session(aws_access_key_id=settings.AWS_KEY_ID,
aws_secret_access_key=settings.AWS_ACCESS_KEY,
region_name=settings.AWS_REGION)
client = self.session.client('s3')
client.upload_file('zango-static','fileToUpload')
url = "some/test/url"
return self.create_response(request, {
'url': url // return's public url of uploaded file
})
Run Code Online (Sandbox Code Playgroud)
我搜索了整个文档,我找不到任何链接,描述如何做到这一点,有人可以解释或提供任何资源,我可以找到灵魂?
运行如下一行:
s3_obj = boto3.resource('s3').Object(bucket, key)
s3_obj.meta.client.generate_presigned_url('get_object', ExpiresIn=0, Params={'Bucket':bucket,'Key':key})
Run Code Online (Sandbox Code Playgroud)
产生如下结果:
https://my-bucket.s3.amazonaws.com/my-key/my-object-name?AWSAccessKeyId=SOMEKEY&Expires=SOMENUMBER&x-amz-security-token=SOMETOKEN
Run Code Online (Sandbox Code Playgroud)
对于具有 ACL 的 s3 对象public-read,所有 GET 参数都是不必要的。
我可以作弊并使用重写 URL 而不使用 GET 参数,但这感觉不干净且很糟糕。
如何使用 boto3 只向我提供公共链接,例如https://my-bucket.s3.amazonaws.com/my-key/my-object-name?换句话说,我如何跳过 中的签名步骤generate_presigned_url?我没有看到任何类似generated_unsigned_url函数的东西。