#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