Cómo enviar archivos a Drupal 8 a través de REST

9

Puedo crear artículos vía RESTsin problemas. Pero no puedo entender cómo enviar archivos.

¿Cómo envío archivos (imágenes) a Drupal 8 a través de REST?

Actualizar:

REST UI - File: /file/{id}

Example image added in article: 
/admin/content/files -> /admin/content/files/usage/1

file {id} = 1?

Get file id 1:

curl --request GET --user admin:admin --header 'Accept: application/hal+json' http://d8.local/file/1
A fatal error occurred: No route found for "GET /file/1"

Publicar imagen (sin contenido de entidad):

curl --request POST --user admin:admin --header 'Content-type: application/hal+json' http://d8.local/entity/file
{"error":"No entity content received."}

No puedo descubrir cómo crear el entity content.

usuario32063
fuente
Parece que hay un par de bloqueadores para enviar archivos. Uno es la codificación de archivos en base64 ( parche drupal.org/node/1927648 disponible) y el otro es permisos de punto final REST para Crear actualización Eliminar ( parche drupal.org/node/2310307 disponible). No he probado ninguno de estos todavía.
Queenvictoria

Respuestas:

4
  • Aplique el parche al núcleo: https://www.drupal.org/node/1927648
  • Instale Rest UI usando: drush dl restui-8.x-1.x
  • Vaya a / admin / config / services / rest y active File /entity/file/{file}
  • En / admin / people / permissions, configure todos los permisos necesarios
  • Asegúrese de que la carpeta de archivos existe y tiene los permisos adecuados
  • Codificar imagen usando la herramienta de comando base64
  • PUBLICAR en drupal.url / entity / file /

    {"_links":
    {
      "type":{"href":"http://drupal.url/rest/type/file/file"}
    },
      "filename":[{"value":"input.jpg"}],
      "filemime":[{"value":"image/jpeg"}],
      "data":[{"value":"insert-output-from-base64-here"}] }

    ingrese la descripción de la imagen aquí

gcardinal
fuente
Cuando carga un archivo con éxito, obtiene un 201, pero no se devuelve nada relacionado con la ubicación del archivo. Esperaría que se devuelva una identificación o ubicación del archivo. ¿Cómo hacemos referencia al archivo una vez que se carga?
Ronnie
Modifiqué EntityResource.phpsegún su parche y la línea 117, devolví la identificación de la entidad y ahora al menos tengo una referencia de esa manera:$response = new ResourceResponse(NULL, 201,['id' => $entity->id()]);
Ronnie
@Ronnie Según la respuesta, esperaría que el archivo se encuentre en la carpeta de archivos de su sitio.
Blake Frederick
1
@BlakeFrederick Eso realmente no me ayuda si necesito guardar una referencia al archivo en la base de datos. Piense en este escenario: tengo un tipo de contenido y un campo de imagen. Una imagen debe estar asociada con ese nodo cuando se crea. Cuando carga el archivo, no se devuelve nada excepto un 201 ... ¿qué le doy a ese nodo para que apunte a la imagen? Es por eso que agregué el $entity->id()a la respuesta. Paso la identificación de la entidad al nodo y ahora ese nodo conoce la imagen
Ronnie
@Ronnie: solo estoy trabajando en esto, pero noto que cuando el archivo se transmite con éxito al servidor, se agrega una fila correspondiente a la file_managedtabla de Drupal . Esta fila tiene un único fid. Creo que el siguiente paso es PUBLICAR la creación de un nuevo nodo con un campo de imagen y usarlo fidpara asociar el campo de imagen con el archivo. Si te entiendo, la pregunta es cómo determinar fidcuándo no se devuelve nada. Noté hoy en un hilo de Drupal que la versión futura de la interfaz de usuario REST devolverá la entidad completa, pero no estoy seguro de cómo resolver este problema por ahora.
Blake Frederick
1
  1. Instale y habilite los módulos RestUi y File Entity .
  2. Vaya a 'admin / config / services / rest' y habilite File Resource con el método de publicación junto con los formatos json y hal_json
  3. Habilite los permisos de publicación Acceda a POST en el recurso de archivo @ admin / people / permissions
  4. Publicar url - http: //d8.local/entity/file? _Format = hal_json
  5. Siguiente formato de datos de publicación (use el codificador base64 para datos de imagen)

    { "_links": { "type": { "href": "http://d8.local/rest/type/file/image" } }, "filename": [ { "value": "favicon-32x32.png" } ], "filemime": [ { "value": "image/png" } ], "filesize": [ { "value": "488" } ], "type": [ { "target_id": "image" } ], "data": [ { "value": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAkUExURUxpcSOq4SOq4SOq4SOq4SOq4SOq4SOq4SOq4SOq4SOq4SOq4U0m8UcAAAAMdFJOUwD/EvAm2qhTPMRrkl4CMYAAAAE1SURBVCjPXZG/S8NQEMePR7Ehnb48khC7BEFFnYJD6/aWOLilVBy6WBVc648/oCii1KlFKDrFwV2tqH+edy9Rk7zh8e7Dfe++944oP5dUO59RDQyPqrFK/WqKCzxUwA30oJyymervlVK8PsVBOd85hh6pyflfhwXg024cjguwBqCjhsCsSOAn+k4MBGpUWAB6Tb6W1VxAgv+MfcPgWUBgazjxoYwlQLrsmBa6MhbH3hep2yu6QJuowWL9Yfs1U4QRSbWOjRts0DMCdEbqjl8s1kYkPqmX7YGRfgy4aJe2IB+0wZJI2s7ojEGbWtJejL1aL55h+wGDVWTWix47+cAug6kAycjs+LkkjFzku0h6dC3D01KxCmdOLrt7pyQ0+Z/tRXT/eEr0dvL7y6zkrbhPtYVPrOAHKZQ53IyepQMAAAAASUVORK5CYII=" } ] }

  6. Establecer autorización, tipo de contenido en encabezados. (Autorización: básica xxxxxxxx tipo de contenido: aplicación / hal + json)

  7. Use el siguiente php curl

    $curl = curl_init();
    curl_setopt_array($curl, array(
      CURLOPT_URL => "http://d8.local/entity/file?_format=hal_json",
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 30,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "POST",
      CURLOPT_POSTFIELDS => "{\n  \"_links\": {\n    \"type\": {\n      \"href\": \"http://d8.local/rest/type/file/image\"\n    }\n  },\n  \"filename\": [\n    {\n      \"value\": \"favicon-32x32.png\"\n    }\n  ],\n  \"filemime\": [\n    {\n      \"value\": \"image/png\"\n    }\n  ],\n  \"filesize\": [\n    {\n      \"value\": \"488\"\n    }\n  ],\n  \"type\": [\n    {\n      \"target_id\": \"image\"\n    }\n  ],\n  \"data\": [\n    {\n      \"value\": \"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAkUExURUxpcSOq4SOq4SOq4SOq4SOq4SOq4SOq4SOq4SOq4SOq4SOq4U0m8UcAAAAMdFJOUwD/EvAm2qhTPMRrkl4CMYAAAAE1SURBVCjPXZG/S8NQEMePR7Ehnb48khC7BEFFnYJD6/aWOLilVBy6WBVc648/oCii1KlFKDrFwV2tqH+edy9Rk7zh8e7Dfe++944oP5dUO59RDQyPqrFK/WqKCzxUwA30oJyymervlVK8PsVBOd85hh6pyflfhwXg024cjguwBqCjhsCsSOAn+k4MBGpUWAB6Tb6W1VxAgv+MfcPgWUBgazjxoYwlQLrsmBa6MhbH3hep2yu6QJuowWL9Yfs1U4QRSbWOjRts0DMCdEbqjl8s1kYkPqmX7YGRfgy4aJe2IB+0wZJI2s7ojEGbWtJejL1aL55h+wGDVWTWix47+cAug6kAycjs+LkkjFzku0h6dC3D01KxCmdOLrt7pyQ0+Z/tRXT/eEr0dvL7y6zkrbhPtYVPrOAHKZQ53IyepQMAAAAASUVORK5CYII=\"\n    }\n  ]\n}",
      CURLOPT_HTTPHEADER => array(
        "authorization: Basic " .base64_encode('User:Password'),
        "cache-control: no-cache",
        "content-type: application/hal+json"
      ),
    ));
    
    $response = curl_exec($curl);
    $err = curl_error($curl);
    
    curl_close($curl);
    
    if ($err) {
      echo "cURL Error #:" . $err;
    } else {
      echo $response;
    }
  8. Ve y revisa el archivo aquí - admin / content / files

Krishna Kanth
fuente
0

Puede instalar el módulo REST UI para ver qué puntos finales puede usar.

Interfaz de usuario muy básica para el módulo REST de Drupal 8.

Como también le permite configurar qué recursos están expuestos por qué autenticación.

Tenga en cuenta que la interfaz de usuario actualmente proporciona los puntos finales incorrectos: - Las rutas REST URI cambiaron a rutas canónicas

Clemens Tolboom
fuente
Descanse el punto final de la IU para el archivo: / file / {id}. He actualizado la pregunta.
user32063