2015-11-19 20 views
12

Boto3を使用してファイルをs3にアップロードし、そのアップロードしたファイルを公開してURLとして返そうとしています。Boto3を使用してAmazon 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 
    }) 

私はこれを行う方法について説明します任意のリンクを見つけることができませんでした全体のドキュメントを検索誰かが私がsoultionを見つけることができる任意のリソースを説明したり、提供することができますか?

+0

この作業を取得するあなたができますか? – nadermx

+0

@nadermx私はこの仕事を手に入れることができませんでした。 –

答えて

18

私は同じ状況にあります。 私が私の場合に必要としているものではない、generate_presigned_url以外のBoto3文書には、一般に読めるS3オブジェクトがあるので、何も見つかりません。

私が思いついた最高のは、次のとおりです。

bucket_location = boto3.client('s3').get_bucket_location(Bucket=s3_bucket_name) 
object_url = "https://s3-{0}.amazonaws.com/{1}/{2}".format(
    bucket_location['LocationConstraint'], 
    s3_bucket_name, 
    key_name) 

あなたがよりよい解決策のためにboto3 github issues listに投稿してみてください。

7

私は同じ問題がありました。 あなたは、次を使用することができ、あなたがあなたのデータを保存するバケット名を知っていると仮定:

import boto3 
from boto3.s3.transfer import S3Transfer 

credentials = { 
    'aws_access_key_id': aws_access_key_id, 
    'aws_secret_access_key': aws_secret_access_key 
} 

client = boto3.client('s3', 'us-west-2', **credentials) 
transfer = S3Transfer(client) 

transfer.upload_file('/tmp/myfile', bucket, key, 
        extra_args={'ACL': 'public-read'}) 

file_url = '%s/%s/%s' % (client.meta.endpoint_url, bucket, key) 
+1

あなたのコードをもう少し詳しく説明できますか? – Whitecat

+0

ありがとうございます。S3Transferを使用してupload_fileのextra_argsは、カスタムエンドポイントのセッションを通してクライアントを作成する際に一緒に使用する必要があります。 – madprops

1

私が見つけた最善の解決策はClient.Config.signature_versionニーズをに設定するだけという、generate_presigned_urlを使用することはまだあります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リポジトリに関連する議論は、以下のとおりです。

関連する問題