Bagaimana cara menyimpan gambar menggunakan Layanan 3

8

Saya telah menemukan beberapa tutorial yang sangat rinci tentang Layanan 3. Saya sangat menghargainya di sini adalah daftar kecil.

http://drupal.org/node/1354202

Bagaimana cara menambahkan banyak gambar ke sebuah simpul menggunakan layanan node.save?

http://drupal.org/node/1699354

Tetapi saya tidak dapat menemukan cara untuk mengunggah gambar dari aplikasi seluler ke server. Apakah itu mungkin ? Di mana saya bisa mendapatkan beberapa contoh?

Apakah ada inti Layanan untuk mencapai ini? Setiap solusi sepertinya saya perlu o kode sesuatu untuk membuatnya bekerja.

niksmac
sumber
Periksa Intisari ini .
Muhammad Reda

Jawaban:

6

Saya punya persyaratan sekali seperti ini di mana, menggunakan layanan web saya harus membuat simpul yang juga akan menyimpan gambar. Kode berikut mengunggah dan menyimpan gambar menggunakan layanan 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'));
  }
}

CATATAN: Kode berikut diuji menggunakan layanan 3. Juga aplikasi iOS yang menggunakan layanan web ini, dan itu berfungsi di sana.

CATATAN: File diunggah dengan permintaan POST.

Saya menguji kode di atas menggunakan plugin Google Chrome yang disebut REST Console . Untuk menginstal pencarian plugin untuk "rest console" di Toko Web Chrome dan instal plugin pertama yang Anda dapatkan hasilnya (dengan panah hijau ke atas dan ke bawah)

Semoga ini membantu!

subhojit777
sumber
1
Terima kasih, dan maksud Anda tidak ada inti Layanan untuk mencapai ini?
niksmac
Belum pernah melihat .. Anda mungkin melihat file api.php dari modul layanan
subhojit777
drupal.org/files/endpoint_resources.png di sini ada sesuatu seperti "file" dalam tipe sumber daya.
niksmac
maaf .. Saya mengambil bantuan pengkodean di resources / file_resource.inc untuk mengunggah gambar menggunakan layanan web .. Saya lupa menyebutkan bahwa sudah lama sejak saya membuat layanan web
subhojit777
Satu hal yang bisa saya sarankan adalah Anda dapat memanggil layanan web secara terprogram dari panggilan balik layanan web Anda dan mendapatkan $ file array .. tetapi bukankah itu menjadi kelebihan? memanggil layanan web lain di dalam web serice
subhojit777
3

Pertama-tama, pastikan di titik akhir Anda mengaktifkan File -> Buat sumber daya.

Dan di "sisi klien" saya melakukan sesuatu seperti ini:

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

Saya melakukan ini dari Drupal lain, dan untuk Drupal 6, port kode ke D7 harus mudah, dan saya pikir Anda mendapatkan ide umum tentang bagaimana melakukannya.

Gnuget
sumber
2

Layanan reguler 3 memiliki titik akhir 'file'. Anda cukup mengaktifkan pembuatan file dan memposting sesuatu seperti ini; file itu sendiri dikodekan base-64:

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

Untuk mengunggah gambar, Anda hanya perlu nama file dan file - yang akan disandikan base64.

Anda dapat memeriksa repo saya di sini , di mana Anda dapat menemukan kelas sederhana untuk bekerja dengan Drupal 7 Rest Services dan file example.php di mana ada beberapa contoh tentang cara menggunakan kelas. Di sana Anda juga dapat menemukan contoh tentang cara mengunggah gambar, yang saya tambahkan baru-baru ini.

https://github.com/flesheater/drupal_rest_server_class

Nikolay Borisov
sumber