Jak wysłać pliki do Drupal 8 przez REST

9

Mogę RESTbez problemu tworzyć artykuły . Ale nie mogę wymyślić, jak przesłać pliki.

Jak przesłać pliki (obrazy) do Drupal 8 za pośrednictwem REST?

Aktualizacja:

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"

Opublikuj obraz (bez zawartości encji):

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

Nie mogę się dowiedzieć, jak utworzyć entity content.

użytkownik32063
źródło
Wygląda na to, że istnieje kilka programów blokujących pliki POST. Jednym z nich jest kodowanie plików base64 ( dostępna łata drupal.org/node/1927648 ), a drugim są uprawnienia punktu końcowego REST do tworzenia aktualizacji aktualizacji ( dostępna łata drupal.org/node/2310307 ). Nie testowałem jeszcze żadnego z nich.
Queenvictoria,

Odpowiedzi:

4
  • Zastosuj łatkę do rdzenia: https://www.drupal.org/node/1927648
  • Zainstaluj interfejs użytkownika Rest przy użyciu: drush dl restui-8.x-1.x
  • Przejdź do / admin / config / services / rest i aktywuj File /entity/file/{file}
  • W obszarze / admin / people / permissions ustaw wszystkie niezbędne uprawnienia
  • Upewnij się, że folder plików istnieje i ma odpowiednie uprawnienia
  • Zakoduj obraz za pomocą narzędzia polecenia base64
  • POST do 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"}] }

    wprowadź opis zdjęcia tutaj

gcardinal
źródło
Po pomyślnym przesłaniu pliku otrzymujesz 201, ale nic nie jest zwracane dotyczące tego, gdzie znajduje się plik. Oczekiwałbym, że zwrócony zostanie identyfikator lub lokalizacja pliku. Jak odwołujemy się do pliku po przesłaniu?
Ronnie,
Zmodyfikowałem na EntityResource.phppodstawie twojej łatki i linii 117, zwróciłem identyfikator bytu i teraz mam przynajmniej odniesienie do niego w ten sposób:$response = new ResourceResponse(NULL, 201,['id' => $entity->id()]);
Ronnie
@ Ronnie Na podstawie odpowiedzi oczekiwałbym, że plik będzie znajdować się w folderze plików Twojej witryny.
Blake Frederick
1
@BlakeFrederick To mi naprawdę nie pomaga, jeśli muszę zapisać odwołanie do pliku w bazie danych. Pomyśl o tym scenariuszu: mam typ zawartości pole obrazu. Obraz musi być skojarzony z tym węzłem podczas tworzenia. Kiedy przesyłasz plik, nic nie jest zwracane oprócz 201 ... co mam dać temu węzłu, aby wskazywał na obraz? Dlatego dodałem $entity->id()odpowiedź. Przekazuję identyfikator bytu do węzła, a teraz ten węzeł wie o obrazie
Ronnie
@ Ronnie - pracuję nad tym sam, ale zauważam, że kiedy plik zostanie pomyślnie przesłany do serwera, odpowiedni wiersz jest dodawany do file_managedtabeli Drupala . Ten wiersz ma unikalny fid. Uważam, że następnym krokiem jest POST utworzenie nowego węzła z polem obrazu i użycie go fiddo skojarzenia pola obrazu z plikiem. Jeśli cię rozumiem, pytanie brzmi, jak ustalić, fidkiedy nic nie zostanie zwrócone. Zauważyłem dzisiaj z wątku Drupal, że przyszła wersja interfejsu REST zwróci pełny byt, ale nie jestem pewien, jak na razie rozwiązać ten problem.
Blake Frederick
1
  1. Zainstaluj i włącz moduły RestUi i File Entity .
  2. Przejdź do „admin / config / services / rest” i włącz zasób plików metodą post wraz z formatami json i hal_json
  3. Włącz uprawnienia do wpisu Uzyskaj dostęp do POST w pliku zasób @ admin / people / permissions
  4. Adres URL - http: //d8.local/entity/file? _Format = hal_json
  5. Poniższy format danych postu (użyj kodera base64 dla danych obrazu)

    { "_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. Ustaw autoryzację, Content-Type w nagłówkach. (Autoryzacja: Basic xxxxxxxx Content-Type: application / hal + json)

  7. Użyj następującego curl 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. Przejdź tutaj i sprawdź plik - admin / content / files

Krishna Kanth
źródło
0

Możesz zainstalować moduł interfejsu użytkownika REST , aby zobaczyć, jakich punktów końcowych możesz użyć.

Bardzo podstawowy interfejs użytkownika dla modułu REST Drupala 8.

Ponieważ pozwala również skonfigurować, które zasoby są ujawniane przez jakie uwierzytelnianie.

Należy pamiętać, że interfejs użytkownika zapewnia obecnie nieprawidłowe punkty końcowe: - Ścieżki REST URI zmieniono na ścieżki kanoniczne

Clemens Tolboom
źródło
Reszta punktu końcowego interfejsu użytkownika dla pliku: / file / {id}. Zaktualizowałem pytanie.
user32063,