Estoy tratando de cargar un formulario con un archivo en mi servidor usando AJAX, pero Symfony no analiza el cuerpo de la solicitud como debería. Este es mi PHP:
#[Route('/api/upload/file', name: "api_upload_file", methods: ['POST'])] public function create(Request $request): JsonResponse { dump($request->files->all()); dump($request->request->all()); dump($request->getContent()); ...y la salida del volcado (la parte del archivo se corta porque ocupa mucho espacio):
[] [] """ ------WebKitFormBoundaryh4t0I09h9iTRNGme Content-Disposition: form-data; name="subcategory" 1 ------WebKitFormBoundaryh4t0I09h9iTRNGme Content-Disposition: form-data; name="main_image"; filename="" Content-Type: application/octet-stream ------WebKitFormBoundaryh4t0I09h9iTRNGme Content-Disposition: form-data; name="more_images"; filename="" Content-Type: application/octet-stream ------WebKitFormBoundaryh4t0I09h9iTRNGme Content-Disposition: form-data; name="original_version" ------WebKitFormBoundaryh4t0I09h9iTRNGme Content-Disposition: form-data; name="version" ------WebKitFormBoundaryh4t0I09h9iTRNGme Content-Disposition: form-data; name="original_title" ------WebKitFormBoundaryh4t0I09h9iTRNGme Content-Disposition: form-data; name="title" """La solicitud se transmite claramente, por lo que no entiendo por qué no se analiza el contenido.
Por si acaso, aquí está la parte de javascript: (Parece JQuery pero no lo es)
form.submit(e => { e.preventDefault(); let formData = createItemForm.formData(); $.ajax('/api/upload/file', { headers: { 'Content-Type': 'multipart/form-data' }, body: formData }) .then(data => data.json()) .then(json => { console.log('uploaded'); }); });¿Cómo debo hacer para obtener los archivos y los valores del formulario en $request->files y $request->request?
NO especifique el encabezado Content-Type usted mismo cuando intente realizar una solicitud de varias partes. Ese encabezado debe incluir el valor del límite (para que el receptor sepa cómo analizar esta solicitud); si lo especifica usted mismo, como solo multipart/form-data , entonces faltará.
Estas bibliotecas de solicitudes generalmente saben cómo configurarlas correctamente por sí mismas, en función de lo que está pasando en una instancia de FormData.