docs icon indicating copy to clipboard operation
docs copied to clipboard

MultipartDecoder requires PECL extension to update file on existing resource

Open BurningDog opened this issue 1 year ago • 2 comments

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 '[email protected];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?

BurningDog avatar Sep 10 '24 10:09 BurningDog

@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.

mikitafreeman avatar Sep 10 '24 11:09 mikitafreeman

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

BurningDog avatar Sep 10 '24 15:09 BurningDog