Cómo guardar imágenes usando los Servicios 3

8

He encontrado algunos tutoriales muy detallados sobre los Servicios 3. Los aprecio mucho aquí es una pequeña lista.

http://drupal.org/node/1354202

¿Cómo agregar múltiples imágenes a un nodo usando el servicio node.save?

http://drupal.org/node/1699354

Pero no puedo encontrar una manera de subir imágenes desde la aplicación móvil al servidor. Es eso posible ? ¿Dónde puedo obtener algún ejemplo?

¿Hay servicios básicos para lograr esto? Cada solución parece que necesito o codificar algo para que funcione.

niksmac
fuente
Marque esta Gist .
Muhammad Reda

Respuestas:

6

Una vez tuve un requisito como este, donde, usando el servicio web, tengo que crear un nodo que también guarde la imagen. El siguiente código carga y guarda la imagen usando el servicio 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'));
  }
}

NOTA: El siguiente código se probó usando los servicios 3. También era una aplicación de iOS que consumía este servicio web y funcionaba allí.

NOTA: Archivo cargado con solicitud POST.

Probé el código anterior usando un complemento de Google Chrome llamado REST Console . Para instalar el complemento, busque "rest console" en Chrome Web Store e instale el primer complemento que obtenga como resultado (con la flecha hacia arriba verde y la flecha hacia abajo azul)

¡Espero que esto ayude!

subhojit777
fuente
1
Gracias, ¿y quiere decir que no hay nada en el núcleo de Servicios para lograr esto?
niksmac
No he visto .. puede ver los archivos de los servicios api.php módulo
subhojit777
drupal.org/files/endpoint_resources.png aquí hay algo así como "archivos" en el tipo de recurso.
niksmac
lo siento ... tomé la ayuda de la codificación en resources / file_resource.inc para cargar la imagen usando el servicio web. Olvidé mencionar que ha pasado mucho tiempo desde que creé el servicio web
subhojit777
Una cosa que puedo sugerir es que puede llamar al servicio web mediante programación desde la devolución de llamada de su servicio web y obtener la matriz $ file ... pero ¿no será eso una sobrecarga? llamar a otro servicio web dentro de un servicio web
subhojit777
3

En primer lugar, asegúrese de habilitar en su punto final el Archivo -> Crear recurso.

Y en el "lado del cliente" hice algo como esto:

/**
 * 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;
}

Hice esto desde otro Drupal, y es para Drupal 6, portar el código a D7 debería ser fácil, y creo que tienes una idea general sobre cómo hacerlo.

Gnuget
fuente
2

Los servicios regulares 3 tienen un punto final 'archivo'. Simplemente puede habilitar la creación de archivos y publicar algo como esto; el archivo en sí mismo está codificado en base 64:

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

Para cargar una imagen, solo necesitaría un nombre de archivo y un archivo, que estaría codificado en base64.

Puede consultar mi repositorio aquí , donde puede encontrar una clase simple para trabajar con Drupal 7 Rest Services y un archivo examples.php donde hay algunos ejemplos sobre cómo usar la clase. Allí también puede encontrar un ejemplo sobre cómo cargar una imagen, que agregué recientemente.

https://github.com/flesheater/drupal_rest_server_class

Nikolay Borisov
fuente