我正在调整图片客户端的大小,然后再将它们发送到我的烧瓶应用程序。
通过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)并上传然后将其删除,这将如何工作?之后删除很重要!
答案 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'