api-platform / docs

API Platform documentation
https://api-platform.com/docs/
166 stars 1.08k forks source link

MultipartDecoder requires PECL extension to update file on existing resource #1975

Open BurningDog opened 1 month ago

BurningDog commented 1 month ago

The context of using MultipartDecoder is when we are Uploading to an Existing Resource with its Fields. MultipartDecoder works as expected when an API POST is done and a new resource is created.

However, at some point we might want to replace the existing uploaded file with a new file. This is most likely done with a PATCH i.e. define this operation (same as with the POST):

        new Patch(
            outputFormats: ['jsonld' => ['application/ld+json']],
            inputFormats: ['multipart' => ['multipart/form-data']],
        ),

However, there's no way I can see in the $request to get the values out of the transmitted data, i.e. both $request->request->all() and $request->files->all() are null.

The curl looks like so:

curl -X 'PATCH' \
  'https://localhost/api/books/1' \
  -H 'accept: application/ld+json' \
  -H 'Content-Type: multipart/form-data' \
  -F 'isbn=' \
  -F 'title=' \
  -F 'description=' \
  -F 'author=' \
  -F 'imageFile=@thiefOfTime.jpg;type=image/jpeg'

I assume that it's not possible to PATCH multipart/form-data, but then this means that we can never update an image via the API.

What do we do instead in this case?

NikDevPHP commented 1 month ago

@BurningDog Hello, in PHP it basically doesn't work.

https://bugs.php.net/bug.php?id=55815 https://github.com/symfony/symfony/issues/9226

But you can use https://pecl.php.net/package/apfd

You can also use the POST method to upload files to the server.

BurningDog commented 1 month ago

Good news - this will be fixed in php 8.4! https://wiki.php.net/rfc/rfc1867-non-post