Как сохранить изображение из POST-запроса с Falcon Python - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь найти способ сохранить изображение, полученное из запроса POST, поэтому все найденные решения оказались не работающими, например, this .

Проблема, в которой вышеупомянутое решение состоит в том, что я просто получаю ошибку тайм-аута.

Теперь я попытался немного изменить код, но он все еще не работает, вы можете мне помочь?

    def on_post(self, req, resp):
        """Handles Login POST requests"""
        json_data = json.loads(req.bounded_stream.read().decode('utf8'))
        base64encoded_image = json_data['image_data']
        with open('pic.png', "wb") as fh:
            fh.write(b64decode(base64encoded_image))

        resp.status = falcon.HTTP_203
        resp.body = json.dumps({'status': 1, 'message': 'success'})

Ошибка Я получаю "json .decoder.JSONDecodeError: Ожидаемое значение: строка 1, столбец 1 (символ 0)"

1 Ответ

1 голос
/ 24 января 2020

На вашем сервере Falcon

Попробуйте сокол-multipart

pip3 install falcon-multipart

Затем включите его в качестве промежуточного программного обеспечения.

from falcon_multipart.middleware import MultipartMiddleware

api = falcon.API(middleware=[MultipartMiddleware()])

Это проанализирует любой multipart/form-data входящий запрос и поместит ключи в req._params, включая файлы, так что вы получите поле как другие параметры.

# your image directory
refimages_path = "/my-img-dir"

# get incoming file
incoming_file = req.get_param("file")

# create imgid
imgId = str(int(datetime.datetime.now().timestamp() * 1000))

# build filename
filename = imgId + "." + incoming_file.filename.split(".")[-1]

# create a file path
file_path = refimages_path + "/" + filename

# write to a temporary file to prevent incomplete files from being used
temp_file_path = file_path + "~"
with open(temp_file_path, "wb") as f:
    f.write(incoming_file.file.read())

# file has been fully saved to disk move it into place
os.rename(temp_file_path, file_path)

На вашем интерфейсе

Отправьте Content-Type: multipart/form-data; в заголовок запроса. Также не забудьте указать boundary, поскольку, как указано в RFC2046 :

Для поля Content-Type для составных объектов требуется один параметр - border. Строка ограничителя границы затем определяется как строка
, состоящая полностью из двух символов дефиса ("-", десятичное значение 45)
, за которыми следует значение параметра границы из поля заголовка Content-Type, необязательный линейный пробел и завершающий CRLF.

...