Python: отправка изображения в API Flask для сохранения на сервере для дальнейшего использования

#python #flask

#python #flask

Вопрос:

Я пытаюсь отправить изображение в API Flask. Пока я использую base64 для кодирования изображения, которое будет отправлено в виде строки. На стороне сервера я получаю эту строку, декодирую ее и пытаюсь записать поверх файла на стороне сервера. Код выполняется, но результирующий JPG недоступен для просмотра, и он показывает «Похоже, мы не поддерживаем этот формат». Я также попытался сохранить файл в других форматах файлов фотографий. Это jpg, который я конвертирую в строку, поэтому я сохраняю как jpg.

Вот мой код на стороне клиента:

 with open(filename, "rb") as img:
    string = base64.b64encode(img.read())

print(type(string))
print(string)

name = 'John Doe'
EmpID = 1
company = 1

def test():
    api_url = "http://192.168.8.13:5000/register-new?emp_name=%samp;company_id=%samp;emp_id=%samp;user_photo=%s" % (name, company, EmpID, string)
    response = requests.post(url= api_url)
    assert response.status_code == 200
 

И вот код на стороне сервера для получения фотографии.

 photo = request.args.get('user_photo')
    photo1 = photo.replace(" ", "")
    f = (base64.b64decode(photo1))
    a = io.BytesIO()
    with open("compare.jpg", "wb") as file:
        file.write(f)
 

Ответ №1:

Если вы действительно хотите загрузить это как данные base64, я предлагаю поместить это как JSON в теле сообщения, а не как параметр GET.

На стороне клиента откройте файл следующим образом:

 with open(filename, "rb") as img:
    string = base64.b64encode(img.read()).decode('utf-8')
 

Затем в вашей test функции извлеките эту image_data строку из URL-адреса и используйте request.post аргумент json , чтобы передать это с правильным типом содержимого. Вы могли бы рассмотреть возможность отправки других переменных, добавив их в словарь, переданный с этим аргументом:

 def test():
    api_url = "http://192.168.8.13:5000/register-new?emp_name=%samp;company_id=%samp;emp_id=%s" % (name, company, EmpID)
    response = requests.post(url= api_url, json={'user_photo':string})
 

Затем на серверной части возьмите это с request.get_json помощью функции Flask и инициализируйте BytesIO объект, прежде чем записывать в него данные и, наконец, записывать в файл:

 @app.route('/register-new', methods=['POST'])
def register_new():
    photo = request.get_json()['user_photo']
    
    photo_data = base64.b64decode(photo)
    
    with open("compare.jpg", "wb") as file:
        file.write(photo_data)
 

С тестовым изображением это работает правильно, что подтверждается командой Linux file :

 $ file compare.jpg
compare.jpg: JPEG image data, baseline, precision 8, 500x750, components 3