Reputation: 1
Title: Problem with Multipart/Form-Data Deserialization in API Platform
Body:
Hello,
I am experiencing an issue with handling multipart/form-data
in my Symfony application using API Platform. When I try to add a message with an attached audio file via a form, I get an error indicating that deserialization for the "multipart" format is not supported.
Details of the Issue:
I am attempting to send a message with an audio file using a POST
multipart request. Here is the error I encounter:
HttpErrorResponse
error
: {@id: '/api/errors/400', @type: 'hydra:Error', title: 'An error occurred', detail: 'Deserialization for the format "multipart" is not supported.', status: 400, …}
Here are the details of my code:
1. API Platform Configuration (api_platform.yaml
):
api_platform:
title: Hello API Platform
version: 1.0.0
formats:
jsonld: ['application/ld+json']
json: ['application/json']
multipart: ['multipart/form-data']
defaults:
stateless: true
cache_headers:
vary: ['Content-Type', 'Authorization', 'Origin']
extra_properties:
standard_put: true
rfc_7807_compliant_errors: true
event_listeners_backward_compatibility_layer: false
keep_legacy_inflector: false
2. Symfony Controller (MessageController.php
):
namespace App\Controller;
use App\Entity\Message;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\ORM\EntityManagerInterface;
class MessageController extends AbstractController
{
#[Route('/api/messages', name: 'api_message_create', methods: ['POST'])]
public function create(Request $request, EntityManagerInterface $entityManager): Response
{
$description = $request->request->get('description');
$keywords = $request->request->get('keywords');
$category = $request->request->get('category');
$audioFile = $request->files->get('audioFile');
if ($audioFile) {
$filename = md5(uniqid()) . '.' . $audioFile->guessExtension();
$audioFile->move($this->getParameter('audio_directory'), $filename);
$message = new Message();
$message->setDescription($description);
$message->setKeywords($keywords);
$message->setCategory($category);
$message->setAudioFile($filename);
$entityManager->persist($message);
$entityManager->flush();
return $this->json($message, Response::HTTP_CREATED);
}
return $this->json(['error' => 'No file uploaded'], Response::HTTP_BAD_REQUEST);
}
}
3. Angular Service (MessageService.ts
):
addMessage(message: Message, audioFile?: File): Observable<Message> {
const formData: FormData = new FormData();
if (message.description) {
formData.append('description', message.description);
}
if (message.keywords) {
formData.append('keywords', message.keywords);
}
if (message.category?.['@id']) {
formData.append('category', message.category['@id']);
}
if (audioFile) {
formData.append('audioFile', audioFile, audioFile.name);
}
return this.http.post<Message>(this.apiUrl, formData).pipe(
catchError(error => {
console.error('Error adding message:', error);
return throwError(error);
})
);
}
4. Error Received:
Deserialization for the format "multipart" is not supported.
Upvotes: 0
Views: 528
Reputation: 5174
By default, Symfony is not able to decode multipart/form-data-encoded data, see documentation.
As shown in the API Platform docs, you need to create your own decoder and denormalizer.
Upvotes: 0