So senden Sie Dateien über REST an Drupal 8

9

Ich kann Artikel über RESTohne Probleme erstellen . Aber ich kann nicht herausfinden, wie man Dateien einreicht.

Wie sende ich Dateien (Bilder) über an Drupal 8 REST?

Aktualisieren:

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"

Bild posten (ohne Entitätsinhalt):

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

Ich kann nicht herausfinden, wie man das erstellt entity content.

user32063
quelle
Es sieht so aus, als gäbe es ein paar Blocker für POST-Dateien. Eine ist die Base64-Codierung von Dateien ( Drupal.org/node/1927648 Patch verfügbar) und die andere sind REST-Endpunktberechtigungen für Create Update Delete ( Drupal.org/node/2310307 Patch verfügbar). Ich habe keines von beiden noch getestet.
Queenvictoria

Antworten:

4
  • Wenden Sie den Patch auf den Kern an: https://www.drupal.org/node/1927648
  • Installieren Sie die Rest-Benutzeroberfläche mit: drush dl restui-8.x-1.x
  • Gehen Sie zu / admin / config / services / rest und aktivieren Sie Datei /entity/file/{file}
  • Legen Sie unter / admin / people / permissions alle erforderlichen Berechtigungen fest
  • Stellen Sie sicher, dass der Dateiordner vorhanden ist und über die entsprechenden Berechtigungen verfügt
  • Codieren Sie das Bild mit dem Befehlstool base64
  • POST an 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"}] }
    

    Geben Sie hier die Bildbeschreibung ein

Kardinal
quelle
Wenn Sie eine Datei erfolgreich hochladen, erhalten Sie eine 201, es wird jedoch nichts zurückgegeben, was den Speicherort der Datei betrifft. Ich würde erwarten, dass eine ID oder ein Speicherort der Datei zurückgegeben wird. Wie verweisen wir auf die Datei, sobald sie hochgeladen wurde?
Ronnie
Ich habe EntityResource.phpbasierend auf Ihrem Patch und Zeile 117 geändert , ich habe die Entitäts-ID zurückgegeben und ich habe jetzt zumindest einen Verweis darauf:$response = new ResourceResponse(NULL, 201,['id' => $entity->id()]);
Ronnie
@Ronnie Aufgrund der Antwort würde ich erwarten, dass sich die Datei im Dateiordner Ihrer Site befindet.
Blake Frederick
1
@BlakeFrederick Das hilft mir allerdings nicht wirklich, wenn ich einen Verweis auf die Datei in der Datenbank speichern muss. Stellen Sie sich dieses Szenario vor: Ich habe einen Inhaltstyp und ein Bildfeld. Ein Bild muss diesem Knoten beim Erstellen zugeordnet werden. Wenn Sie die Datei hochladen, wird nur eine 201 zurückgegeben. Was gebe ich diesem Knoten, um auf das Bild zu zeigen? Deshalb habe ich das $entity->id()der Antwort hinzugefügt . Ich übergebe die Entitäts-ID an den Knoten und jetzt weiß dieser Knoten über das Bild Bescheid
Ronnie
@Ronnie - Ich arbeite gerade selbst daran, aber ich stelle fest, dass, wenn die Datei erfolgreich vom Server übertragen wurde, eine entsprechende Zeile zu Drupals file_managedTabelle hinzugefügt wird . Diese Zeile hat eine eindeutige fid. Ich glaube, der nächste Schritt besteht darin, die Erstellung eines neuen Knotens mit einem Bildfeld zu POSTEN und das fidzu verwenden, um das Bildfeld mit der Datei zu verknüpfen. Wenn ich Sie verstehe, ist die Frage, wie Sie feststellen können, fidwann nichts zurückgegeben wird. Ich habe heute in einem Drupal-Thread festgestellt, dass die zukünftige Version der REST-Benutzeroberfläche die vollständige Entität zurückgeben wird, bin mir jedoch nicht sicher, wie ich dieses Problem vorerst lösen soll.
Blake Frederick
1
  1. Installieren und aktivieren Sie die Module RestUi und File Entity .
  2. Goto 'admin / config / service / Rest' und aktivieren Datei - Ressource mit post - Methode zusammen mit json und hal_json Formaten
  3. Post-Berechtigungen aktivieren Greifen Sie auf POST in der Dateiressource @ admin / people / permissions zu
  4. URL posten - http: //d8.local/entity/file? _Format = hal_json
  5. Folgendes Format der Post-Daten (Base64-Encoder für Bilddaten verwenden)

    { "_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. Festlegen der Berechtigung, Inhaltstyp in Kopfzeilen. (Berechtigung: Basic xxxxxxxx Inhaltstyp: application / hal + json)

  7. Verwenden Sie die folgende PHP-Locke

    $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. Gehen Sie und überprüfen Sie die Datei hier - admin / content / files

Krishna Kanth
quelle
0

Sie können das REST-UI- Modul installieren, um zu sehen, welche Endpunkte Sie verwenden können.

Sehr einfache Benutzeroberfläche für das REST-Modul von Drupal 8.

Außerdem können Sie konfigurieren, welche Ressourcen durch welche Authentifizierung verfügbar gemacht werden.

Bitte beachten Sie, dass die Benutzeroberfläche derzeit die falschen Endpunkte bereitstellt: - REST-URI-Pfade wurden in kanonische Pfade geändert

Clemens Tolboom
quelle
Rest UI-Endpunkt für Datei: / file / {id}. Ich habe die Frage aktualisiert.
user32063