Передача двоичного файла через HTTP POST - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть локальный файл Python, который декодирует двоичные файлы.Этот файл Python сначала читает из файла, открывает его как двоичный файл, а затем сохраняет его в буфере и интерпретирует его.Чтение это просто:

with open(filepath, 'rb') as f:
    buff = f.read()
read_all(buff)

Это прекрасно работает локально.Теперь я хотел бы настроить работу Azure Python, где я могу отправить файл, ок.100 КБ, через HTTP POST, а затем прочитайте интерпретированные метаданные, что хорошо работает мой оригинальный скрипт на python.

Сначала я удалил функцию чтения, так что теперь я буду работать только с буфером.В моем задании Python Azure у меня есть следующее, вызванное HttpRequest

my_data = reader.read_file(req.get_body())

Чтобы проверить мою отправку, я попробовал следующее в python

import requests

url = 'http://localhost:7071/api/HttpTrigger'
files = {'file': open('test', 'rb')}
with open('test', 'rb') as f:
        buff = f.read()

r = requests.post(url, files=files) #Try using files
r = requests.post(url, data=buff) #Try using data

Я также пробовал вПочтальон добавляет файл в тело в виде двоичного файла и устанавливает заголовки в application / octet-stream

Все это не отправляет двоичный файл так же, как это делал оригинальный f.read ().Таким образом, я получаю неверную интерпретацию двоичного файла.

Что такое file.read делает иначе, чем то, как я отправляю его в виде сообщения HTTP Body?

Распечатка первогострока из локального файла чтения Python дает.

b'\n\n\xfe\xfe\x00\x00\x00\x00\\\x18,A\x18\x00\x00\x00(\x00\x00\x00\x1f\x00\x00\

В то время как распечатка его в req.get_body () показывает мне

b'\n\n\xef\xbf\xbd\xef\xbf\xbd\x00\x00\x00\x00\\\x18,A\x18\x00\x00\x00(\x00\x00\x00\x1f\x00\

Так что что-то явно не так.Любая помощь, почему это может быть иначе?

Спасибо

РЕДАКТИРОВАТЬ:

Я реализовал аналогичную функцию во Flask, и она работает хорошо.Код в колбе просто захватывает файл из POST.Нет кодирования / декодирования.

if request.method == 'POST':
      f = request.files['file']
      #f.save(secure_filename(f.filename))
      my_data = reader.read_file(f.read())

Чем отличается функция Azure?

1 Ответ

0 голосов
/ 27 февраля 2019

Вы можете попробовать UTF-16 для декодирования и выполнить дальнейшие действия в своем коде.

Вот код для этого:

with open(path_to_file,'rb') as f:
    contents = f.read()
contents = contents.rstrip("\n").decode("utf-16")

В основном после выполнения re.get_body выполните следующую операцию:

contents = contents.rstrip("\n").decode("utf-16")

Проверьте, дает ли он тот же вывод, что и ваш прием в локальном питонефайл.

Надеюсь, это поможет.

...