Come inviare file a Drupal 8 tramite REST


9

Posso creare articoli RESTsenza problemi. Ma non riesco a capire come inviare i file.

Come posso inviare file (immagini) a Drupal 8 tramite REST?

Aggiornare:

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"

Pubblica immagine (senza contenuto dell'entità):

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

Non riesco a scoprire come creare il entity content.



Sembra che ci siano un paio di blocchi per i file POST. Uno è la codifica base64 dei file ( patch drupal.org/node/1927648 disponibile) e l'altro sono le autorizzazioni dell'endpoint REST per Crea aggiornamento Elimina ( patch drupal.org/node/2310307 disponibile). Non ho ancora provato nessuno di questi.
Queenvictoria,

Risposte:


4
  • Applica patch al core: https://www.drupal.org/node/1927648
  • Installa l'IU Rest utilizzando: drush dl restui-8.x-1.x
  • Vai su / admin / config / services / rest e attiva File /entity/file/{file}
  • In / admin / persone / autorizzazioni impostare tutte le autorizzazioni necessarie
  • Assicurarsi che la cartella dei file esista e abbia le autorizzazioni appropriate
  • Codifica l'immagine usando lo strumento di comando base64
  • POST su 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"}] }

    inserisci qui la descrizione dell'immagine


Quando si carica correttamente un file si ottiene 201, ma non viene restituito nulla in relazione alla posizione del file. Mi aspetto che venga restituito un ID o un percorso del file. Come facciamo riferimento al file una volta caricato?
Ronnie,

Ho modificato in EntityResource.phpbase alla patch e alla riga 117, ho restituito l'ID entità e ora ho almeno un riferimento in questo modo:$response = new ResourceResponse(NULL, 201,['id' => $entity->id()]);
Ronnie,

@Ronnie Sulla base della risposta, mi aspetto che il file si trovi nella cartella dei file del tuo sito.
Blake Frederick,

1
@BlakeFrederick Questo non mi aiuta molto se devo salvare un riferimento al file nel database. Pensa a questo scenario: ho un tipo di contenuto un campo immagine. Un'immagine deve essere associata a quel nodo quando viene creata. Quando carichi il file, non viene restituito nulla tranne un 201 ... cosa devo dare a quel nodo per puntare all'immagine? Questo è il motivo per cui ho aggiunto il $entity->id()alla risposta. Passo l'ID entità al nodo e ora quel nodo conosce l'immagine
Ronnie

@Ronnie: ci sto solo lavorando, ma noto che quando il file viene trasmesso correttamente al server, una file_managedtabella corrispondente viene aggiunta alla tabella di Drupal . Questa riga ha un unico fid. Credo che il prossimo passo sia POSTARE la creazione di un nuovo nodo con un campo immagine e usare il fidper associare il campo immagine al file. Se ti capisco, la domanda è come determinare fidquando non viene restituito nulla. Ho notato da un thread Drupal oggi che la versione futura dell'interfaccia utente REST restituirà l'intera entità, ma per ora non sono sicuro di come risolvere questo problema.
Blake Frederick,

1
  1. Installa e abilita i moduli RestUi e File Entity .
  2. Vai a 'admin / config / services / rest' e abilita la risorsa file con il metodo post insieme ai formati json e hal_json
  3. Abilita autorizzazioni post Accedi a POST su File resource @ admin / people / rights
  4. URL post - http: //d8.local/entity/file? _Format = hal_json
  5. Formato seguente dei dati di post (utilizzare l'encoder base64 per i dati di immagine)

    { "_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. Imposta autorizzazione, tipo di contenuto nelle intestazioni (autorizzazione: tipo di contenuto xxxxxxxx di base: application / hal + json)

  7. Usa il seguente ricciolo php

    $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. Vai e controlla il file qui - admin / content / files


0

È possibile installare il modulo UI REST per vedere quali endpoint è possibile utilizzare.

Interfaccia utente molto semplice per il modulo REST di Drupal 8.

Inoltre, consente di configurare quali risorse sono esposte dall'autenticazione.

Si noti che l'interfaccia utente attualmente fornisce gli endpoint errati: - Percorsi URI REST modificati in percorsi canonici


Riposare l'endpoint dell'interfaccia utente per il file: / file / {id}. Ho aggiornato la domanda.
user32063,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.