Subiendo archivos

Curso: JSON:API

Subir un archivo a través de JSON:API a Drupal es un poco complejo y requiere que sepamos como están las entidades relacionadas.

En este caso, tenemos la receta (un Nodo) usando el campo “field_media_image” para poder tener una imagen, pero este campo es una relación a Media de tipo imagen; pero Media realmente no almacena el archivo de la imagen, si no que se usa el campo “field_media_image” dentro del Media de tipo imagen para relacionar Media con File, de modo que se nos queda de esta manera:

Nodo --> Media --> File

Sabiendo esto ahora podemos avanzar, y es que para subir un archivo tenemos que hacer un POST a la entidad donde se va a usar el archivo, en este caso, se usa en Media, a si que tenemos que hacer un POST a Media. También hay otro requisito, y es que debemos añadir al endpoint el campo en el cual estará el archivo, de modo que se nos queda un endpoint tal que así:

/jsonapi/media/image/field_media_image

Ahora nos faltan las cabeceras:

Content-Type: application/octet-stream
Accept: application/vnd.api+json
Content-Disposition: file; filename="nombre.extension"

En la cabecera “Content-Disposition” debemos indicar el nombre del archivo, no tiene porque coincidir con el nombre real de nuestro archivo ya que se renombrará con el que indiquemos.

Para finalizar ya tenemos que adjuntar el archivo como binario a la petición y enviarla.

Al hacer esto JSON:API nos responderá con un json de la entidad “file—file” que es la que gestiona los archivos. De la respuesta nos interesa el campo ID que es el que contiene la UUID, ya que tendremos que hacer otro POST esta vez para crear un Media que será el que gestione el archivo.

Tendremos que usar las mismas cabeceras que en el resto de POST que hemos hecho:

Content-Type: application/vnd.api+json
Accept: application/vnd.api+json

Este es el endpoint al cual tenemos que hacer la petición:

/jsonapi/media/image

Y enviar el json necesario para el POST, aseguraros de en la relación del campo “field_media_image” poneis el UUID de la entidad File que hemos creando en el primer paso:

{
   "data":{
      "type":"media--image",
      "attributes":{
         "name":"Zelda"
      },
      "relationships":{
         "field_media_image":{
            "data":{
               "type":"file--file",
               "id":"d72d9b2b-c8e1-40d5-8f1f-9ef6f3806558"
            }
         }
      }
   }
}

Si todo sale bien nos devolverá de nuevo el json con los datos de la entidad y de nuevo, nos interesa el UUID, a si que lo copiamos y esta vez crearemos el Nodo para finalmente poder usar el Media vinculándolo.

Son las mismas cabeceras que antes, pero usando este endpoint:

/jsonapi/node/repice

Con este json:

{
   "data":{
      "type":"node--recipe",
      "attributes":{
	     "title":"My primera receta",
         "field_recipe_instruction":{
            "value":"Mi primera receta contiene muchos ingredientes y no tengo claro como hacerla xD"
         },
         "moderation_state":"published",
		 "field_difficulty": "medium",
		 "field_preparation_time": 25,
		 "field_number_of_servings": 8,
		 "field_summary": {
            "value": "Un quiche de inspiración italiana con tomates secos y calabacín. Una comida ligera perfecta para un día de verano.",
            "format": "basic_html"
         }
      },
      "relationships":{
         "field_media_image":{
            "data":{
               "type":"media--image",
               "id":"d930e8cd-a0e6-4dd1-b32b-e92a14ee48ee"
            }
         }
      }
   }
}

Y listo, es un proceso largo y si no se conoce como funciona Drupal relacionando todo es bastante complicado de subir un archivo ya que la documentación no es buena.