Размер PDF нарушает FastAPI с использованием python -multipart? - PullRequest
2 голосов
/ 17 июня 2020

Я пытаюсь загрузить PDF в FastAPI . После преобразования PDF-файла в base64-blob и сохранения его в txt-файле я отправляю этот файл в FastAPI с помощью Postman.

Это мой код на стороне сервера:

from fastapi import FastAPI, File, UploadFile
import base64

app = FastAPI()

@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):
    contents = await file.read()
    blob = base64.b64decode(contents)
    pdf = open('result.pdf','wb')
    pdf.write(blob)
    pdf.close()
    return {"filename": file.filename}

Эта процедура отлично работает для одностраничного документа PDF размером 279 КБ (размер blob: 372 КБ), но не подходит для многостраничного документа размером 1,8 МБ (размер blob: 2,4 МБ).

Когда я пытаюсь, я получаю следующее ПРЕДУПРЕЖДЕНИЕ и ответ на неверный запрос 400 (вместе с «деталью» ответа: «Произошла ошибка при синтаксическом анализе тела»): «Не удалось найти граничный символ 55 в индексе 2»

Я уверен, что этому поведению должно быть объяснение? Может это как-то связано с asyn c?

1 Ответ

1 голос
/ 19 июня 2020

Это, скорее всего, проблема с сохранением файла с использованием open().

Для больших файлов pdf.close() будет выполняться до того, как pdf.write() завершит сохранение всего содержимого файла.

Чтобы обеспечить запись всего файла до его закрытия, используйте with, например:

with open('failed.pdf', 'wb') as outfile:
    outfile.write(blob)

Используя with, вам не нужно будет close() после записи. with также следует считать лучшей практикой при сохранении файла в локальной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...