Как сохранить загруженное пользователем изображение с сервера flask в хранилище Google?

#python #flask #google-cloud-platform #google-cloud-storage #bucket

#питон #flask #google-облачная платформа #google-облачное хранилище #ведро

Вопрос:

Я пытаюсь найти способ сохранить изображение, загруженное пользователем на сервер flask, в хранилище Google. Это моя попытка загрузить изображение. Это терпит неудачу.

 @app.route("/upload-image", methods=["GET", "POST"])
def upload_image():
    if request.method == "POST":
        try:
            if request.files:
                image = request.files["image"]
                readImg = image.read()
                content = bytes(readImg)

                client = storage.Client().from_service_account_json(os.environ['GOOGLE_APPLICATION_CREDENTIALS'])
                print('1)')
                bucket = storage.Bucket(client, "uploaded-usrimg")
                print('2)')
                file_blob = bucket.blob(content)
                print('3)')
                
                return render_template('result.html', request=result.payload[0].display_name)
                # return render_template('homepage.html')
        
        except Exception as e:
            print('error creating image data')
            print(e)

 

Мой большой двоичный объект (изображение) не загружается в мою корзину.
Я получаю эту ошибку:

 127.0.0.1 - - [13/Jan/2021 18:40:58] "POST /upload-image HTTP/1.1" 500 -
1)
2)
error creating image data
'utf-8' codec can''t decode byte 0x89 in position 0: invalid start byte
[2021-01-13 18:41:11,663] ERROR in app: Exception on /upload-image [POST]
Traceback (most recent call last):
  File "/Users/me/.pyenv/versions/3.7.3/lib/python3.7/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/me/.pyenv/versions/3.7.3/lib/python3.7/site-packages/flask/app.py", line 1953, in full_dispatch_request
    return self.finalize_request(rv)
  File "/Users/me/.pyenv/versions/3.7.3/lib/python3.7/site-packages/flask/app.py", line 1968, in finalize_request
    response = self.make_response(rv)
  File "/Users/me/.pyenv/versions/3.7.3/lib/python3.7/site-packages/flask/app.py", line 2098, in make_response
    "The view function did not return a valid response. The"
TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement.
127.0.0.1 - - [13/Jan/2021 18:41:11] "POST /upload-image HTTP/1.1" 500 -
 

Есть идеи, как устранить эту ошибку? Или другой способ загрузки в Google bucket? Большое спасибо.

Комментарии:

1. проверьте это gist.github.com/merqurio/c0b62eb1e1769317907f

2. Каждый раз, когда я пытаюсь импортировать google.appengine, я сталкиваюсь с ошибкой, связанной с модулем: (Спасибо за предложение!

Ответ №1:

Я полагаю, что это сообщение об ошибке связано с тем, как вы обрабатываете изображение. В вашем коде readImg = image.read() вы декодируете изображение в соответствии с правилами UTF-8 и сталкиваетесь с последовательностью байтов, которая не разрешена в кодировке UTF-8.

Вам нужно открыть изображение с b помощью в open() режиме, чтобы файл считывался как двоичный, а содержимое оставалось в виде байтов.

 with open(path, 'rb') as f:
    contents = f.read()
 

Если вы использовали разные типы файлов, byte XXXX in position 0 это также может означать, что файл закодирован неправильно, поэтому, например, вы можете попробовать это или подобное:

 open(path, encoding='utf-16') as f:
    contents = f.read()