Upload a base64 string(Image Data) to S3 server in Python using Boto3 and get URL in return

戏子无情 提交于 2020-01-14 17:39:13

问题


I am trying to upload a base 64 string , which is basically image data to an S3 bucket using Python. I have googled and got a few answers but none of them works for me. And some answers use boto and not boto3, hence they are useless to me. I have also tried this link: Boto3: upload file from base64 to S3 but it is not working for me as Object method is unknown to the s3.

Following is my code so far:

import boto3

s3 = boto3.client('s3')
filename = photo.personId + '.png'
bucket_name = 'photos-collection'
dataToPutInS3 = base64.b64decode(photo.url[23:])

What is the correct way to upload this variable dataToPutInS3 data to s3 bucket and get a url back from it.


回答1:


You didn't mention how do you get the base64. In order to reproduce,my code snippet getting the image from the internet using the requests library and later convert it to base64 using the base64 library.

The trick here is to make sure the base64 string you want to upload doesn't include the data:image/jpeg;base64 prefix. And, as @dmigo mentioned in the comments, you should work with boto3.resource and not boto3.client.

from botocore.vendored import requests
import base64
import boto3

s3 = boto3.resource('s3')
bucket_name = 'BukcetName'
#where the file will be uploaded, if you want to upload the file to folder use 'Folder Name/FileName.jpeg'
file_name_with_extention = 'FileName.jpeg'
url_to_download = 'URL'

#make sure there is no data:image/jpeg;base64 in the string that returns
def get_as_base64(url):
    return base64.b64encode(requests.get(url).content)

def lambda_handler(event, context):
    image_base64 = get_as_base64(url_to_download)
    obj = s3.Object(bucket_name,file_name_with_extention)
    obj.put(Body=base64.b64decode(image_base64))
    #get bucket location
    location = boto3.client('s3').get_bucket_location(Bucket=bucket_name)['LocationConstraint']
    #get object url
    object_url = "https://%s.s3-%s.amazonaws.com/%s" % (bucket_name,location, file_name_with_extention)
    print(object_url)

More about S3.Object.put.



来源:https://stackoverflow.com/questions/58516323/upload-a-base64-stringimage-data-to-s3-server-in-python-using-boto3-and-get-ur

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!