Python flask ajax暂时将解码后的base64映像保存到服务器

时间:2017-03-20 10:09:08

标签: python ajax image

我正在调整图片客户端的大小,然后再将它们发送到我的烧瓶应用程序。

通过POST请求发送调整大小的图像,该图像被绘制到要调整大小的画布中。

在我的应用中,图像通过base64解码:

def resize_image(item):
    content = item.split(';')[1]
    image_encoded = content.split(',')[1]
    body = base64.decodestring(image_encoded.encode('utf-8'))
    return body

imagedata在type String变量中存储为body。我可以将数据保存到我的本地机器上,它可以工作:

filename = 'some_image.jpg' 
with open(filename, 'wb') as f:
    print "written"
    f.write(body)

我需要的是将调整后的图像上传到AWS3。有一点我需要read()图像内容,但是直到图像作为文件保存到某个地方它仍然是一个字符串,所以它失败了:

file_data = request.values['a']
imagedata = resize_image(file_data)              

s3 = boto.connect_s3(app.config['MY_AWS_ID'], app.config['MY_AWS_SECRET'], host='s3.eu-central-1.amazonaws.com')

bucket_name = 'my_bucket'
bucket = s3.get_bucket(bucket_name)
k = Key(bucket)  

# fails here         
file_contents = imagedata.read()

k.key = "my_images/" + "test.png"

k.set_contents_from_string(file_contents)

除非有其他解决方案,否则我认为我将图像暂时保存到我的服务器(Heroku)并上传然后将其删除,这将如何工作?之后删除很重要!

2 个答案:

答案 0 :(得分:2)

set_contents_from_string将字符串作为参数,您可以直接将图像字符串数据传递给它以上传到S3

<强>解决方案:

删除此部分:

file_contents = imagedata.read()

直接在这里使用imagedata

k.set_contents_from_string(imagedata)

答案 1 :(得分:0)

如果您需要在数据上调用.read(),但不需要在磁盘上保存文件,请使用StringIO:

import StringIO
output = StringIO.StringIO()
output.write('decoded image')
output.seek(0)


output.read()
Out[1]: 'decoded image'