Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django models 使用Boto3上传到AmazonS3并返回公共url_Django Models_Amazon S3_Boto3 - Fatal编程技术网

Django models 使用Boto3上传到AmazonS3并返回公共url

Django models 使用Boto3上传到AmazonS3并返回公共url,django-models,amazon-s3,boto3,Django Models,Amazon S3,Boto3,我正在尝试使用Boto3将文件上载到s3,并将上载的文件公开,并将其作为url返回 class UtilResource(BaseZMPResource): class Meta(BaseZMPResource.Meta): queryset = Configuration.objects.none() resource_name = 'util_resource' allowed_methods = ['get'] def post_list(self, reques

我正在尝试使用Boto3将文件上载到s3,并将上载的文件公开,并将其作为url返回

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 
    })
我搜索了整个文档,但找不到任何描述如何执行此操作的链接。有人能解释或提供我可以找到解决方案的任何资源吗?

我也遇到了同样的情况。 除了generate_presigned_url之外,在Boto3文档中找不到任何东西,这不是我的情况下所需要的,因为我有公共可读的S3对象

我想到的最好的办法是:

bucket\u location=boto3.client('s3').get\u bucket\u location(bucket=s3\u bucket\u name)
对象url=”https://s3-{0}.amazonaws.com/{1}/{2}”。格式(
桶位置['LocationConstraint'],
s3_bucket_name,
密钥(U名称)
您可以尝试在上发布以获得更好的解决方案。

我也遇到了同样的问题。 假设您知道要存储数据的存储桶名称,则可以使用以下命令:

导入boto3
从boto3.s3.transfer导入S3Transfer
凭证={
“aws\u访问\u密钥\u id”:aws\u访问\u密钥\u id,
“aws\U机密访问密钥”:aws\U机密访问密钥
}
client=bot3.client('s3','us-west-2',**凭证)
传输=S3传输(客户端)
transfer.upload_文件('/tmp/myfile',bucket,key,
额外参数={'ACL':'public read'})
文件\u url=“%s/%s/%s%”(client.meta.endpoint\u url,bucket,key)

我找到的最佳解决方案仍然是使用
生成预签名url
,只需将
Client.Config.signature\u版本设置为
botocore.UNSIGNED

下面返回不带签名的公共链接

config = Config(signature_version=botocore.UNSIGNED)
config.signature_version = botocore.UNSIGNED
boto3.client('s3', config=config).generate_presigned_url('get_object', ExpiresIn=0, Params={'Bucket': bucket, 'Key': key})
关于boto3存储库的相关讨论如下:


对于Django,如果您将Django存储与Bot3一起使用,则下面的代码完全符合您的要求:

default_storage.url(name=f.name)

希望为公共可访问对象建立直接URL以避免出于某种原因使用
generate\u presigned\u URL
的人

考虑到空格和特殊字符问题,请使用
urllib.parse.quote_plus
构建URL

  • 我的对象键:
    2018-11-26 16:34:48.351890+09:00.jpg
    请注意空格和“:”
  • aws控制台中的S3公共链接:
    https://s3.my_region.amazonaws.com/my_bucket_name/2018-11-26+16%3A34%3A48.351890%2B09%3A00.jpg
下面的代码对我来说没问题

import boto3    
s3_client = boto3.client
bucket_location = s3_client.get_bucket_location(Bucket='my_bucket_name')
url = "https://s3.{0}.amazonaws.com/{1}/{2}".format(bucket_location['LocationConstraint'], 'my_bucket_name', quote_plus('2018-11-26 16:34:48.351890+09:00.jpg')
print(url)

我用了一个f字串

import boto3    
#s3_client = boto3.session.Session(profile_name='sssss').client('s3')
s3_client=boto3.client('s3')
s3_bucket_name = 'xxxxx'
s3_website_URL= f"http://{s3_bucket_name}.s3-website.{s3_client.get_bucket_location(Bucket=s3_bucket_name)['LocationConstraint']}.amazonaws.com"

通过查看现有的答案和他们的评论,我做了以下工作,并很好地处理了文件名的特殊情况,例如具有空白、具有特殊字符(ASCII)、角落大小写。例如,表格的文件名:“key=value.txt”


你在哪里可以让它工作?@nadermx我不能让它工作你能帮我吗?使用虚拟托管样式S3 URL:谢谢,使用S3Transfer在upload_文件中额外的_参数是我在通过自定义端点的会话创建客户端时需要结合使用的参数。如何上载文件object@pyd查看此=>@NomanGul该链接没有解释如何在内存中上载对象和从中生成公共URL,因为我不需要URL中的区域<代码>https://s3.amazonaws.com/my_bucket/my_file.jpg
对我有效。@KimberlyW这是因为您的资产区域是US-EAST1。例如,如果文件包含非ascii和空格,则此答案不起作用。此答案也不适用于与localstack的集成测试。这应该是可接受的答案。例如,如果文件名是包含空格的,那么keen的答案也会被打断,然后key\u name=object\u url的启发式方法会被一些前缀打断。但是它的过期时间很短。最多只有7天,STS的时间更短。为了让答案更清晰,最好显示配置的来源。示例:
config=config(signature\u version=botocore.UNSIGNED)url=s3\u session.client('s3',config=config)。生成预签名的\u url(ClientMethod='get\u object',ExpiresIn=0,Params={'Bucket':Bucket\u name',Key'})
根据您的建议编辑答案
import boto3
import botocore

config = botocore.client.Config(signature_version=botocore.UNSIGNED)
object_url = boto3.client('s3', config=config).generate_presigned_url('get_object', ExpiresIn=0, Params={'Bucket': s3_bucket_name, 'Key': key_name})
print(object_url)