Estoy creando una API REST que requiere cargar archivos. Con fines de prueba, estoy cargando archivos a través del cartero, pero no sé cómo acceder a los archivos del lado del servidor. Pude recuperar el _dict con fines de autenticación, pero para el file , devuelve None .
#arguments - create, delete, view, list, search, upload, download @app.post("/incident-resource/{service}") async def incident_resource_service_handler(service, request: Request): try: session = Session() reqDataForm: FormData = await request.form() reqData = reqDataForm._dict file = reqDataForm.get('resource') # in form(key='resource', value=abc.jpeg) print(type(file)) #< class 'NoneType' > user = usr_getAuthenticatedUser(session, reqData) userRole = getRole(session, user.role_id) except Exception as e: session.rollback() return handleException(e)Según la documentación , "los archivos se cargarán como" datos de formulario ", y los recibirá declarando el tipo en su punto final como bytes o UploadFile . Si necesita enviar datos adicionales junto con el archivo, puede echar un vistazo en esta respuesta .
Sin embargo, si necesita hacer eso en la forma en que aborda el problema en su pregunta, eche un vistazo a continuación. Según la documentación de Starlette , puede obtener el nombre del archivo y el contenido de la siguiente manera. Cualquiera que sea el nombre de clave que proporcione en el lado del cliente, también debe usar ese en el lado del servidor. Debajo de "upload_file" se utiliza como clave. Si es necesario recibir y guardar archivos múltiples o de gran tamaño, considere usar la escritura asincrónica en su lugar, como se describe aquí .
lado del servidor
@app.post("/upload") async def create_file(request: Request): form = await request.form() filename = form["upload_file"].filename contents = await form["upload_file"].read() with open(filename, 'wb') as f: f.write(contents) return filenamelado del cliente (ejemplo usando solicitudes de Python)
import requests url = 'http://127.0.0.1:8000/upload' file = {'upload_file': open('test_files/a.txt','rb')} resp = requests.post(url=url, files = file) print(resp.json())lado del cliente (ejemplo usando TestClient de FastAPI)
from fastapi.testclient import TestClient from app import app client = TestClient(app) file = {'upload_file': open('test_files/a.txt','rb')} response = client.post("/upload", files = file) print(response.json())