У меня есть конечная точка, которая принимает файл и строковый параметр, который я передаю через тело формы. Но я заметил, что при отладке:
import uvicorn
from fastapi import FastAPI, File, Form
app = FastAPI()
@app.post('/test')
def test(test_item: str = Form(...), test_file: bytes = File(...)):
return {
"test_item": test_item,
"test_file_len": len(test_file),
"test_file_contents": test_file.decode('utf-8')
}
if __name__ == '__main__':
uvicorn.run(app, host="0.0.0.0", port=8000)
с помощью этой простой команды curl с test_file.txt, имеющим текст:
curl localhost:8000/test -X POST -F test_file=@"test_file.txt" -F test_item="test"
не работал с этой ошибкой:
{
"detail": [
{
"loc": [
"body",
"test_file"
],
"msg": "byte type expected",
"type": "type_error.bytes"
}
]
}
но, что интересно, это сработало:
import uvicorn
from fastapi import FastAPI, File, Form
app = FastAPI()
@app.post('/test')
def test(test_file: bytes = File(...), test_item: str = Form(...)):
return {
"test_item": test_item,
"test_file_len": len(test_file),
"test_file_contents": test_file.decode('utf-8')
}
if __name__ == '__main__':
uvicorn.run(app, host="0.0.0.0", port=8000)
с той лишь разницей, что вы получаете файл перед элементом Form. Кто-нибудь знает, почему это произойдет? Похоже, что необходимо выгрузить файлы перед формой. Возможно, файл уничтожается, когда Form анализирует тело формы http. Я не видел ничего в документации FastAPI об этом для формы и файлов.