Comment enregistrer des images à l'aide des services 3

8

J'ai trouvé des tutoriels très détaillés sur les services 3. Je les apprécie beaucoup, voici une petite liste.

http://drupal.org/node/1354202

Comment ajouter plusieurs images à un nœud en utilisant le service node.save?

http://drupal.org/node/1699354

Mais je ne peux pas trouver un moyen de télécharger des images de l'application mobile sur le serveur. Est-ce possible ? Où puis-je obtenir un exemple?

Existe-t-il dans le noyau Services pour y parvenir? Chaque solution semble avoir besoin de quelque chose de code pour le faire fonctionner.

niksmac
la source
Vérifiez ce Gist .
Muhammad Reda

Réponses:

6

J'ai eu une exigence une fois comme celle-ci où, en utilisant le service Web, je dois créer un nœud qui enregistrera également l'image. Le code suivant télécharge et enregistre l'image à l'aide du service Web.

// File validator.
$validators = array(
  /**
   * Defaults already allow png, jpg etc. If more needed to be supported,
   * edit here.
   */
  'file_validate_extensions' => array(),
  'file_validate_size' => array(),
);


foreach ($_FILES['files']['name'] as $field_name => $file_name) {
  // Save the file and get file object.
    $file = file_save_upload($field_name, $validators, file_default_scheme() . "://");

  // Check whether image is uploaded.
  if ($file->fid) {
    $node = new stdClass();
    $node->type = 'CONTENT_TYPE';
    $node->title = 'TITLE';
    $node->language = LANGUAGE_NONE;
    $node->uid = 'USER_UID';
    node_object_prepare($node);

    $node->field_custom[$node->language][0]['value'] = 'SOME_VALUE';
    // File upload here..
    $node->field_image[$node->language][0] = (array)$file;

    $node = node_submit($node);
    node_save($node);
  }
  else {                                                                      
    return services_error(t('File upload failed'), 406, t('File upload failed'));
  }
}

REMARQUE: Le code suivant a été testé à l'aide des services 3. De plus, c'était une application iOS qui consommait ce service Web, et cela a fonctionné là-bas.

REMARQUE: fichier téléchargé avec la demande POST.

J'ai testé le code ci-dessus en utilisant un plugin Google Chrome appelé REST Console . Pour installer le plug-in, recherchez "console de repos" dans le Chrome Web Store et installez le premier plug-in que vous obtenez en résultat (avec flèche verte verte et flèche bleue descendante)

J'espère que cela t'aides!

subhojit777
la source
1
Merci, et vous voulez dire qu'il n'y a rien dans le noyau des services pour y parvenir?
niksmac
N'a pas vu .. vous pouvez voir les fichiers api.php du module services
subhojit777
drupal.org/files/endpoint_resources.png voici quelque chose comme des "fichiers" dans le type de ressource.
niksmac
désolé .. J'ai pris l'aide du codage dans resources / file_resource.inc pour télécharger une image à l'aide du service Web .. J'ai oublié de mentionner que cela fait longtemps que j'ai créé le service Web
subhojit777
Une chose que je peux suggérer est que vous pouvez appeler le service Web par programme à partir de votre rappel de service Web et obtenir le tableau $ file .. mais ne sera-ce pas une surcharge? appeler un autre service Web à l'intérieur d'un service Web
subhojit777
3

Tout d'abord, assurez-vous que dans votre point de terminaison, activez la ressource Fichier -> Créer.

Et dans le "côté client", j'ai fait quelque chose comme ça:

/**
 * Upload a file using services 3.X
 * 
 * @param the path of the local file
 * @return bool|int the fid of the file.
 *
 * 
 * With the fid you can attach this file in the node object before to be send.
 * ej.
 * $node->title = 'My remote node';
 * $fid = node_upload_image('/The_path/to_the/local_file.jpg');
 * $node->file_field[0] = array( 
 *    'fid' => $fid,
 *    'list' => 1,
 *    'data' => array()
 * );
 * // Other fields related with the node.
 * ...
 * 
 * // Sending the node.
 * $data = http_build_query($node, '', '&');
 * $response = drupal_http_request('myremotesite.com'. '/node', array(
 *   'Accept' => 'application/json', 
 *   'Cookie' => 'auth_cookie_info'
 * ), 'POST', $data);
 *
 * Done. 
 */
function node_upload_image($image_path) {
  $file = array(
    'filesize' => filesize($image_path),
    'filename' => basename($image_path),
    'file' => base64_encode(file_get_contents($image_path)),
    'uid'  => 1  // This should change it by the user who use the service.
  );

  $data = http_build_query($file, '', '&');
  $response = drupal_http_request('myremotesite.com/myservice-endpoint' . "/file", array('Accept' => 'application/json', 'Cookie' => 'auth_cookie_info'), "POST", $data);


  if ($response->code == 200) {
    return json_decode($response->data)->fid;
  }


  $this->error =  $response->status_message; 
  return false;
}

Je l'ai fait à partir d'un autre Drupal, et pour Drupal 6, le portage du code vers D7 devrait être facile, et je pense que vous avez une idée générale de la façon de le faire.

Gnuget
la source
2

Les services réguliers 3 ont un point de terminaison «fichier». Vous pouvez simplement activer la création de fichiers et publier quelque chose comme ceci; le fichier lui-même est encodé en base 64:

{
    "filename": "user993.jpg",
    "target_uri": "pictures/user993.jpg",
    "filemime": "image/jpeg",
    "file": "/9j/4AAQSkZJRgABAQELIiyoy0pUQRoFjAVVGAAMACiigBaKKKAP/2Q==...",
    "filesize": "5356"
}
rfay
la source
2

Pour télécharger une image, vous n'auriez besoin que d'un nom de fichier et d'un fichier - qui seraient encodés en base64.

Vous pouvez consulter mon dépôt ici , où vous pouvez trouver une classe simple pour travailler avec Drupal 7 Rest Services et un fichier examples.php où il y a quelques exemples sur la façon d'utiliser la classe. Vous y trouverez également un exemple sur la façon de télécharger une image, que j'ai ajoutée récemment.

https://github.com/flesheater/drupal_rest_server_class

Nikolay Borisov
la source