2014-10-13 4 views
3

Я пытаюсь загрузить некоторые изображения в GCS через экземпляр App Engine с помощью Flask, но каждый раз, когда файл загружается, когда я его загружаю, я получаю поврежденный файл. Что я делаю не так ?Загрузка файлов в Google Cloud Storage с флягой

Я загрузил и использовал клиент Google Cloud Storage, как это делается в документах.

@app.route('/upload', methods=['POST']) 
def upload(): 
    if request.method == 'POST': 
     file = request.files['file'] 
     extension = secure_filename(file.filename).rsplit('.', 1)[1] 
     options = {} 
     options['retry_params'] = gcs.RetryParams(backoff_factor=1.1) 
     options['content_type'] = 'image/' + extension 
     bucket_name = "gcs-tester-app" 
     path = '/' + bucket_name + '/' + str(secure_filename(file.filename)) 
     if file and allowed_file(file.filename): 
      try: 
       with gcs.open(path, 'w', **options) as f: 
        f.write(str(file)) 
        print jsonify({"success": True}) 
       return jsonify({"success": True}) 
      except Exception as e: 
       logging.exception(e) 
       return jsonify({"success": False}) 

Благодарим за помощь!

ответ

4

Вы загружаете (записываете в поток gcs) представление str файлового объекта, а не содержимое файла.

попробовать это:

@app.route('/upload', methods=['POST']) 
def upload(): 
    if request.method == 'POST': 
     file = request.files['file'] 
     extension = secure_filename(file.filename).rsplit('.', 1)[1] 
     options = {} 
     options['retry_params'] = gcs.RetryParams(backoff_factor=1.1) 
     options['content_type'] = 'image/' + extension 
     bucket_name = "gcs-tester-app" 
     path = '/' + bucket_name + '/' + str(secure_filename(file.filename)) 
     if file and allowed_file(file.filename): 
      try: 
       with gcs.open(path, 'w', **options) as f: 
        f.write(file.stream.read())# instead of f.write(str(file)) 
        print jsonify({"success": True}) 
       return jsonify({"success": True}) 
      except Exception as e: 
       logging.exception(e) 
       return jsonify({"success": False}) 

Но это не самый эффективный способ сделать это, также, есть 32mb ограничение на загрузку файлов прямо из приложения двигателя, способ избежать этого, подписав загружать URL-адрес с помощью GCS и загружать файл непосредственно из front-end в GCS или вы можете создать URL-адрес для загрузки файлов с blobstore и обработчик для обработки после загрузки, как указано здесь: https://cloud.google.com/appengine/docs/python/blobstore/

+0

Хорошо! Поэтому, если я понимаю это хорошо, лучше создать URL-адрес для загрузки файла, потому что если я не загружаю файл в App Engine, а затем записываю его в Clou Storage? Спасибо за вашу помощь ! – Merqurio

+1

@Merqurio идея состоит в том, чтобы загрузить файл через службу google, и вы обрабатываете только небольшую часть загрузки, также, если вы используете это на движке приложения, есть ограничение в 32 Мбайт на загрузку файлов, большие файлы будут должны идти прямо к blobstorage или gcs. –