Upload image available at public URL to S3 using boto

后端 未结 9 1209
广开言路
广开言路 2020-12-23 13:48

I\'m working in a Python web environment and I can simply upload a file from the filesystem to S3 using boto\'s key.set_contents_from_filename(path/to/file). However, I\'d l

相关标签:
9条回答
  • 2020-12-23 14:47

    A simple 3-lines implementation that works on a lambda out-of-the-box:

    import boto3
    import requests
    
    s3_object = boto3.resource('s3').Object(bucket_name, object_key)
    
    with requests.get(url, stream=True) as r:
        s3_object.put(Body=r.content)
    

    The source for the .get part comes straight from the requests documentation

    0 讨论(0)
  • 2020-12-23 14:51

    Unfortunately, there really isn't any way to do this. At least not at the moment. We could add a method to boto, say set_contents_from_url, but that method would still have to download the file to the local machine and then upload it. It might still be a convenient method but it wouldn't save you anything.

    In order to do what you really want to do, we would need to have some capability on the S3 service itself that would allow us to pass it the URL and have it store the URL to a bucket for us. That sounds like a pretty useful feature. You might want to post that to the S3 forums.

    0 讨论(0)
  • 2020-12-23 14:51
    import boto
    from boto.s3.key import Key
    from boto.s3.connection import OrdinaryCallingFormat
    from urllib import urlopen
    
    
    def upload_images_s3(img_url):
        try:
            connection = boto.connect_s3('access_key', 'secret_key', calling_format=OrdinaryCallingFormat())       
            bucket = connection.get_bucket('boto-demo-1519388451')
            file_obj = Key(bucket)
            file_obj.key = img_url.split('/')[::-1][0]
            fp = urlopen(img_url)
            result = file_obj.set_contents_from_string(fp.read())
        except Exception, e:
            return e
    
    0 讨论(0)
提交回复
热议问题