Comment envoyer des fichiers à Drupal 8 via REST


9

Je peux créer des articles via RESTsans problème. Mais je ne peux pas comprendre comment soumettre des fichiers.

Comment envoyer des fichiers (images) à Drupal 8 via REST?

Mise à jour:

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"

Publier l'image (sans contenu d'entité):

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

Je ne peux pas savoir comment créer le fichier entity content.



Il semble qu'il y ait quelques bloqueurs pour les fichiers POST. L'un est le codage base64 des fichiers (le correctif drupal.org/node/1927648 est disponible) et l'autre est les autorisations de point de terminaison REST pour Créer la suppression de mise à jour (le correctif drupal.org/node/2310307 est disponible). Je n'ai encore testé ni l'un ni l'autre.
Queenvictoria

Réponses:


4
  • Appliquer le correctif au noyau: https://www.drupal.org/node/1927648
  • Installez Rest UI en utilisant: drush dl restui-8.x-1.x
  • Accédez à / admin / config / services / rest et activez Fichier /entity/file/{file}
  • Sous / admin / people / permissions, définissez toutes les autorisations nécessaires
  • Assurez-vous que le dossier de fichiers existe et dispose des autorisations appropriées
  • Encoder l'image à l'aide de l'outil de commande base64
  • POST vers 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"}] }

    entrez la description de l'image ici


Lorsque vous téléchargez un fichier avec succès, vous obtenez un 201, mais rien n'est renvoyé concernant l'emplacement du fichier. Je m'attendrais à ce qu'un ID ou un emplacement du fichier soit retourné. Comment référencer le fichier une fois qu'il est téléchargé?
Ronnie

J'ai modifié en EntityResource.phpfonction de votre patch et de la ligne 117, j'ai retourné l'ID d'entité et j'ai maintenant au moins une référence de cette façon:$response = new ResourceResponse(NULL, 201,['id' => $entity->id()]);
Ronnie

@Ronnie Sur la base de la réponse, je m'attendrais à ce que le fichier se trouve dans le dossier de fichiers de votre site.
Blake Frederick

1
@BlakeFrederick Cela ne m'aide pas vraiment si je dois enregistrer une référence au fichier dans la base de données. Pensez à ce scénario: j'ai un type de contenu un champ d'image. Une image doit être associée à ce nœud lors de sa création. Lorsque vous téléchargez le fichier, rien n'est retourné sauf un 201 ... que dois-je donner à ce nœud pour pointer vers l'image? C'est pourquoi j'ai ajouté le $entity->id()à la réponse. Je passe l'ID d'entité au nœud et maintenant ce nœud connaît l'image
Ronnie

@Ronnie - Je suis en train de travailler sur cela moi-même, mais je remarque que lorsque le fichier est transmis avec succès au serveur, une ligne correspondante est ajoutée à la file_managedtable de Drupal . Cette ligne a un caractère unique fid. Je crois que l'étape suivante consiste à POSTER la création d'un nouveau nœud avec un champ d'image et à utiliser le fidpour associer le champ d'image au fichier. Si je vous comprends bien, la question est de savoir comment déterminer fidquand rien n'est retourné. J'ai remarqué aujourd'hui à partir d'un thread Drupal que la future version de l'interface utilisateur REST retournera l'entité complète, mais je ne sais pas comment résoudre ce problème pour l'instant.
Blake Frederick

1
  1. Installez et activez les modules RestUi et File Entity .
  2. Allez sur 'admin / config / services / rest' et activez File Resource avec la méthode post avec les formats json et hal_json
  3. Activer les autorisations de publication Accéder au POST sur la ressource de fichier @ admin / people / permissions
  4. URL de publication - http: //d8.local/entity/file? _Format = hal_json
  5. Format suivant des données de publication (utilisez l'encodeur base64 pour les données d'image)

    { "_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. Définissez l'autorisation, le type de contenu dans les en-têtes. (Autorisation: Basic xxxxxxxx Content-Type: application / hal + json)

  7. Utilisez le php curl suivant

    $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. Allez vérifier le fichier ici - admin / content / files


0

Vous pouvez installer le module d' interface utilisateur REST pour voir quels points de terminaison vous pouvez utiliser.

Interface utilisateur très basique pour le module REST de Drupal 8.

Comme il vous permet également de configurer quelles ressources sont exposées par quelle authentification.

Veuillez noter que l'interface utilisateur fournit actuellement les points de terminaison incorrects: - Les chemins URI REST ont été changés en chemins canoniques


Reste le point de terminaison de l'interface utilisateur pour le fichier: / file / {id}. J'ai mis à jour la question.
user32063
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.