So speichern Sie Bilder mit Services 3

8

Ich habe einige sehr detaillierte Tutorials zu Services 3 gefunden. Ich schätze sie sehr. Hier ist eine kleine Liste.

http://drupal.org/node/1354202

Wie füge ich einem Knoten mit dem Dienst node.save mehrere Bilder hinzu?

http://drupal.org/node/1699354

Aber ich kann keine Möglichkeit finden, Bilder von der mobilen App auf den Server hochzuladen. Ist das möglich ? Wo kann ich ein Beispiel bekommen?

Gibt es in Services Core, um dies zu erreichen? Jede Lösung sieht so aus, als müsste ich etwas codieren, damit es funktioniert.

niksmac
quelle
Überprüfen Sie diesen Kern .
Muhammad Reda

Antworten:

6

Ich hatte einmal eine solche Anforderung, bei der ich mithilfe des Webdienstes einen Knoten erstellen muss, der auch das Bild speichert. Der folgende Code lädt Bilder über den Webdienst hoch und speichert sie.

// 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'));
  }
}

HINWEIS: Der folgende Code wurde mithilfe von Diensten 3 getestet. Außerdem war es eine iOS-App, die diesen Webdienst nutzte und dort funktionierte.

HINWEIS: Datei mit POST-Anforderung hochgeladen.

Ich habe den obigen Code mit einem Google Chrome-Plugin namens REST Console getestet . Um das Plugin zu installieren, suchen Sie im Chrome Web Store nach "Rest Console" und installieren Sie das erste Plugin, das Sie als Ergebnis erhalten (mit grünem Pfeil nach oben und blau nach unten).

Hoffe das hilft!

subhojit777
quelle
1
Vielen Dank, und Sie meinen, es gibt nichts im Service-Kern, um dies zu erreichen?
Niksmac
Nicht gesehen .. Sie können die api.php-Dateien des Servicemoduls sehen
subhojit777
drupal.org/files/endpoint_resources.png hier ist so etwas wie "Dateien" im Ressourcentyp.
Niksmac
Entschuldigung. Ich habe die Hilfe der Codierung in resources / file_resource.inc verwendet, um ein Bild über den Webdienst hochzuladen. Ich habe vergessen zu erwähnen, dass es lange her ist, seit ich den Webdienst erstellt habe
subhojit777
Eine Sache, die ich vorschlagen kann, ist, dass Sie den Webdienst programmgesteuert über Ihren Webdienst-Rückruf aufrufen und das $ file-Array erhalten können. Aber ist das nicht eine Überlastung? Aufrufen eines anderen Webdienstes innerhalb eines Webdienstes
subhojit777
3

Stellen Sie zunächst sicher, dass in Ihrem Endpunkt die Datei -> Ressource erstellen aktiviert ist.

Und auf der "Client-Seite" habe ich so etwas gemacht:

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

Ich habe dies von einem anderen Drupal aus gemacht, und für Drupal 6 sollte es einfach sein, den Code auf D7 zu portieren, und ich denke, Sie bekommen eine allgemeine Vorstellung davon, wie es geht.

Gnuget
quelle
2

Die regulären Dienste 3 haben einen 'Datei'-Endpunkt. Sie können einfach die Dateierstellung aktivieren und so etwas posten. Die Datei selbst ist Base-64-codiert:

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

Zum Hochladen eines Bildes benötigen Sie nur einen Dateinamen und eine Datei, die base64-codiert sind.

Sie können mein Repo hier überprüfen , wo Sie eine einfache Klasse für die Arbeit mit Drupal 7 Rest Services und eine Datei examples.php finden, in der es einige Beispiele für die Verwendung der Klasse gibt. Dort finden Sie auch ein Beispiel zum Hochladen eines Bildes, das ich kürzlich hinzugefügt habe.

https://github.com/flesheater/drupal_rest_server_class

Nikolay Borisov
quelle