将调整大小后的图像上传到S3

发布于 2021-01-29 15:07:01

我正在尝试将调整大小的图像上传到S3:

fp = urllib.urlopen('http:/example.com/test.png')
img = cStringIO.StringIO(fp.read())

im = Image.open(img)
im2 = im.resize((500, 100), Image.NEAREST)  
AK = 'xx' # Access Key ID 
SK = 'xx' # Secret Access Key

conn = S3Connection(AK,SK) 
b = conn.get_bucket('example')
k = Key(b)
k.key = 'example.png'
k.set_contents_from_filename(im2)

但我得到一个错误:

 in set_contents_from_filename
    fp = open(filename, 'rb')
TypeError: coercing to Unicode: need string or buffer, instance found
关注者
0
被浏览
115
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您需要先将输出图像转换为一组字节,然后才能上载到s3。您可以将图像写入文件然后上传文件,也可以使用cStringIO对象来避免写入磁盘,就像我在这里所做的那样:

    import boto
    import cStringIO
    import urllib
    import Image
    
    #Retrieve our source image from a URL
    fp = urllib.urlopen('http://example.com/test.png')
    
    #Load the URL data into an image
    img = cStringIO.StringIO(fp.read())
    im = Image.open(img)
    
    #Resize the image
    im2 = im.resize((500, 100), Image.NEAREST)
    
    #NOTE, we're saving the image into a cStringIO object to avoid writing to disk
    out_im2 = cStringIO.StringIO()
    #You MUST specify the file type because there is no file name to discern it from
    im2.save(out_im2, 'PNG')
    
    #Now we connect to our s3 bucket and upload from memory
    #credentials stored in environment AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
    conn = boto.connect_s3()
    
    #Connect to bucket and create key
    b = conn.get_bucket('example')
    k = b.new_key('example.png')
    
    #Note we're setting contents from the in-memory string provided by cStringIO
    k.set_contents_from_string(out_im2.getvalue())
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看