2015-02-12 3 views
0

Попытка загрузить изображение в ведро на s3 amazon.Ошибка при загрузке файла s3 с помощью python

Изображение загружено через форму и изображение хранится в файле «»:

file = request.files['file'] 

Я также пытаюсь переименовать его в «имя файла», который хранит идентификатор пользователя загружаете изображения.

Мое приложение работает на Heroku

Вот код:

 filename = str(userName.id) 

     # S3_BUCKET, AWS_ACCESS_KEY & AWS_SECRET_KEY = HEROKU envar from config.py 

     conn = boto.connect_s3(app.config['AWS_ACCESS_KEY'], app.config['AWS_SECRET_KEY']) 
     bucket = conn.get_bucket(app.config['S3_BUCKET']) 

     key = '%s.jpg' % filename 
     k = Key(bucket) 
     k.key = key 
     k.set_contents_from_filename(file.filename) 

При попытке загрузить изображение с именем «888888.jpg» Я получаю следующее сообщение об ошибке на бревнах Heroku:

2015-02-12T22:56:33.214246+00:00 heroku[router]: at=info method=POST path="/registering" host=monkey-me.herokuapp.com request_id=261d25bd-10bc-4703-aa38-badbcb4e634e fwd="213.243.186.53" dyno=web.1 connect=1ms service=809ms status=500 bytes=456 
2015-02-12T22:56:33.181111+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request 
2015-02-12T22:56:33.181113+00:00 app[web.1]:  rv = self.dispatch_request() 
2015-02-12T22:56:33.181101+00:00 app[web.1]: Traceback (most recent call last): 
2015-02-12T22:56:33.181105+00:00 app[web.1]:  response = self.full_dispatch_request() 
2015-02-12T22:56:33.181082+00:00 app[web.1]: Exception on /registering [POST] 
2015-02-12T22:56:33.181103+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app 
2015-02-12T22:56:33.181106+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request 
2015-02-12T22:56:33.181110+00:00 app[web.1]:  reraise(exc_type, exc_value, tb) 
2015-02-12T22:56:33.181107+00:00 app[web.1]:  rv = self.handle_user_exception(e) 
2015-02-12T22:56:33.181114+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request 
2015-02-12T22:56:33.181117+00:00 app[web.1]: File "/app/app.py", line 361, in registering 
2015-02-12T22:56:33.181121+00:00 app[web.1]:  with open(filename, 'rb') as fp: 
2015-02-12T22:56:33.181119+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/boto/s3/key.py", line 1358, in set_contents_from_filename 
2015-02-12T22:56:33.181116+00:00 app[web.1]:  return self.view_functions[rule.endpoint](**req.view_args) 
2015-02-12T22:56:33.181109+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception 
2015-02-12T22:56:33.181122+00:00 app[web.1]: IOError: [Errno 2] No such file or directory: u'888888.jpg' 
2015-02-12T22:56:33.181118+00:00 app[web.1]:  k.set_contents_from_filename(file.filename) 

Что я делаю неправильно (это первый раз, когда я работаю с S3)

ответ

0

You need to store the file on disk перед использованием upload_part_from_filename. Вы также можете использовать cStringIO для загрузки файла в память и загрузить его на S3 вместо записи на диск в первую очередь, но имейте в виду, что большие файлы должны быть загружены в кусок или вы пополняете свою память, используя метод ниже. Вот пример того, как вы могли бы использовать cStringIO

# Python 2.7 
import cStringIO 

buff = cStringIO.StringIO() 
f = request.FILES['file'] 
buff.write(f.read()) 
buff.seek(0) 
k.set_contents_from_file(buff) 
+0

Спасибо за ответ! –

Смежные вопросы