Azure функция сохранения временного файла pdf из файла inputtream повреждена - PullRequest
0 голосов
/ 26 марта 2020

Я загрузил PDF-файл в хранилище BLOB-объектов, которое при загрузке через MS Azure Explorer прекрасно работает.

У меня есть функция Azure, которая вызывается очередью, а также имеет привязку ввода к BLOB-объекту, который назван в сообщении очереди.

При записи входящего большого двоичного объекта на диск размер удваивается. Также pdf поврежден и не может быть открыт в pdf-ридере. При открытии в блокноте символы отличаются от того, что появляется в исходном файле. Похоже на проблему с кодировкой, но мы имеем дело с байтами, а не с текстом, поэтому не уверен, почему это происходит.

Вот мой код (с использованием python 3):

import azure.functions as func
import tempfile
import os.path

def main(msg: func.QueueMessage, inputblob: func.InputStream, outputTable: func.Out[str]) -> None:

    with tempfile.TemporaryDirectory() as td:
        f_name1 = os.path.join(td, "old.pdf")
        with open(f_name1, 'wb') as fh:
            fh.write(inputblob.read())

1 Ответ

1 голос
/ 27 марта 2020

Да, это выглядит неработающим, первые несколько байтов изменены, возможно, больше ( marvin3.jpg - исходное изображение в хранилище больших двоичных объектов).

hex dump

imgcat on bad image

В качестве обходного пути просто добавьте это к входной привязке BLOB-объекта function.json:

"dataType": "binary"

, как в :

{
  "name": "inputBlob",
  "type": "blob",
  "dataType": "binary",
  "direction": "in",
  "path": "images/input_image.jpg",
  "connection": "AzureWebJobsStorage"
}

Вам не нужно указывать это в (это необходимо только для JavaScript работника), но я думаю, что где-то в SDK есть ошибка, которая не позволяет выводимый тип.

Полный рабочий пример:

def main(req: func.HttpRequest, inputBlob: func.InputStream) -> func.HttpResponse:
    blob = inputBlob.read()

    with open("out.jpg", "wb") as outfile:
        outfile.write(blob)

    return func.HttpResponse(
            "Done. Binary data written to out.jpg",
            status_code=200
        )

imgcat on good image

Это сквозное испытание, которое они проводят в Python рабочий репозиторий также предполагает наличие "dataType": "binary" при использовании привязок ввода BLOB-объектов (независимо от типа файла, который вы должны получить в байтах).

Если вы пытаетесь разыграть входной BLOB-объект как inputBlob: bytes вместо inputBlob: func.InputStream, проблема становится более очевидной, если вы не указали dataType:

Exception: TypeError: a bytes-like object is required, not 'str'

Рабочий Python возвращает вам строку inste объявление байтов.

У меня открыта проблема здесь для обновления документов.

...