Я пытаюсь загрузить изображения в корзину Amazon S3 из приложения Flask. Вот мой код:
def s3upload(image, acl='public-read'):
key = app.config['S3_KEY']
secret = app.config['S3_SECRET']
bucket = app.config['S3_BUCKET']
conn = S3Connection(key, secret)
mybucket = conn.get_bucket(bucket)
r = redis.StrictRedis(connection_pool = pool)
iid = r.incr('image')
now = time.time()
r.zadd('image:created_on', now, iid)
k = Key(mybucket)
k.key = iid
k.set_contents_from_string(image.read())
return iid
@app.route('/', methods = ['GET', 'POST'])
def index():
form = ImageForm(request.form)
print 'CHECKING REQUEST'
if request.method == 'POST' and form.image:
print 'VALID REQUEST'
image = form.image.read()
upload = s3upload(image)
print upload
else:
image = None
r = redis.StrictRedis(connection_pool = pool)
last_ten = r.zrange('image:created_on', 0, 9)
print last_ten
images = []
key = app.config['S3_KEY']
secret = app.config['S3_SECRET']
bucket = app.config['S3_BUCKET']
conn = S3Connection(key, secret)
mybucket = conn.get_bucket(bucket)
for image in last_ten:
images.append(mybucket.get_key(image, validate = False))
return render_template('index.html', form=form, images=images, image=image)
Однако я получаю сообщение об ошибке k.set_contents_from_string(image.read())
, говорящее 'FileField' object has no attribute 'read'
. Все, что я подготовил, указывало на то, что это правильный способ загрузки изображения на S3, и я нашел несколько примеров, когда они вызывают .read()
для объекта FileField
, и это работает нормально. Спасибо за вашу помощь.
form.image.data.read()
. В идеале вы должны передавать содержимое файла в потоковом режиме, а не считывать его в память. - person Blender   schedule 12.03.2014enctype="multipart/form-data"
формы. - person Andrey Borisko   schedule 30.11.2016