Hizmetler 3 kullanılarak görüntüler nasıl kaydedilir?


8

Hizmetler 3 hakkında çok ayrıntılı öğreticiler bulduk. Burada küçük bir liste olduğunu çok takdir ediyorum.

http://drupal.org/node/1354202

Node.save hizmetini kullanarak bir düğüme birden çok görüntü nasıl eklenir?

http://drupal.org/node/1699354

Ancak mobil uygulamadan sunucuya resim yüklemek için bir yol bulamıyorum. Mümkün mü ? Nereden bir örnek alabilirim?

Bunu yapmak için Hizmetler merkezinde var mı? Her çözüm i işe almak için o kod bir şey gerekiyor gibi görünüyor.


Bu kontrol Özü .
Muhammed Reda

Yanıtlar:


6

Bir kez böyle bir gereksinim vardı, web hizmeti kullanarak ben de görüntü kaydedecek bir düğüm oluşturmak zorunda. Aşağıdaki kod, web servisini kullanarak resim yükler ve kaydeder.

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

NOT: Aşağıdaki kod hizmetler 3 kullanılarak test edilmiştir. Ayrıca bu web hizmetini tüketen bir iOS uygulamasıydı ve orada çalıştı.

NOT: Dosya POST isteği ile yüklendi.

Yukarıdaki kodu REST Konsolu adlı bir Google Chrome eklentisi kullanarak test ettim . Chrome Web Mağazası'nda "dinlenme konsolu" eklenti aramasını yüklemek ve sonuçta elde ettiğiniz ilk eklentiyi yüklemek için (yukarı yeşil ve aşağı mavi okla)

Bu yardımcı olur umarım!


1
Teşekkürler, ve bunu yapmak için Hizmetler çekirdeğinde hiçbir şey yok mu demek istiyorsun?
niksmac

Görmedim .. hizmet modülünün api.php dosyalarını görebilirsiniz
subhojit777

drupal.org/files/endpoint_resources.png burada kaynak türünde "dosyalar" gibi bir şey var.
niksmac

üzgünüm .. Ben web hizmeti kullanarak görüntü yüklemek için kaynaklar / file_resource.inc kodlama yardım aldı .. Ben web hizmeti oluşturduktan bu yana uzun zaman oldu bahsetmeyi unuttum
subhojit777 28:13

I-ebilmek önermek bir şey web hizmeti geri arama web programlı arama ve $ dosya dizisi elde edebilirsiniz .. ama bu bir aşırı yük olmayacak mı? bir web serice içinde başka bir web hizmeti arıyor
subhojit777

3

Her şeyden önce, uç noktanızda Dosya -> Kaynak oluştur'un etkinleştirildiğinden emin olun.

Ve "müşteri tarafında" ben böyle bir şey yaptım:

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

Bunu başka bir Drupal'dan yaptım ve Drupal 6 için, kod D7'ye kolay olmalı ve bunu nasıl yapacağınız hakkında genel bir fikir edindiğinizi düşünüyorum.


2

Normal servisler 3 bir 'dosya' uç noktasına sahiptir. Sadece dosya oluşturmayı etkinleştirebilir ve böyle bir şey gönderebilirsiniz; dosyanın kendisi base-64 kodludur:

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

2

Bir görüntüyü yüklemek için yalnızca bir dosya adına ve base64 kodlu bir dosyaya ihtiyacınız olacaktır.

Sen benim repo kontrol edebilir buraya sen Drupal 7 istirahat Hizmetler ve sınıfını nasıl kullanılacağına ilişkin bazı örnekler vardır bir examples.php dosyası ile çalışmak için basit bir sınıf nerede bulabileceğini. Orada, yakın zamanda eklediğim bir görüntünün nasıl yükleneceğine ilişkin bir örnek de bulabilirsiniz.

https://github.com/flesheater/drupal_rest_server_class

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.