วิธีบันทึกรูปภาพโดยใช้บริการ 3


8

ฉันพบบทเรียนที่มีรายละเอียดบางอย่างเกี่ยวกับบริการ 3 ฉันขอขอบคุณพวกเขามาก ๆ ที่นี่เป็นรายการเล็ก ๆ

http://drupal.org/node/1354202

วิธีการเพิ่มหลายภาพไปยังโหนดโดยใช้บริการ node.save?

http://drupal.org/node/1699354

แต่ฉันไม่สามารถหาวิธีอัพโหลดรูปภาพจากแอพมือถือไปยังเซิร์ฟเวอร์ได้ เป็นไปได้ไหม ฉันจะขอตัวอย่างได้ที่ไหน

มีบริการหลักในการทำสิ่งนี้หรือไม่ ทุกทางออกดูเหมือนว่าฉันต้องการรหัส o เพื่อให้มันทำงานได้


คำตอบ:


6

ฉันมีความต้องการเช่นนี้เมื่อใช้บริการเว็บฉันต้องสร้างโหนดที่จะบันทึกรูปภาพ รหัสต่อไปนี้อัพโหลดและบันทึกภาพโดยใช้บริการเว็บ

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

หมายเหตุ: รหัสต่อไปนี้ผ่านการทดสอบโดยใช้บริการ 3. นอกจากนี้ยังเป็นแอพ iOS ที่ใช้บริการเว็บนี้และใช้งานได้ที่นั่น

หมายเหตุ: ไฟล์ที่อัพโหลดพร้อมคำขอ POST

ผมทดสอบโค้ดข้างต้นโดยใช้ Google Chrome ปลั๊กอินที่เรียกว่าREST คอนโซล หากต้องการติดตั้งการค้นหาปลั๊กอินสำหรับ "rest console" ใน Chrome Web Store และติดตั้งปลั๊กอินแรกที่คุณจะได้รับ (ด้วยลูกศรสีเขียวขึ้นและลงสีน้ำเงิน)

หวังว่านี่จะช่วยได้!


1
ขอบคุณและคุณหมายถึงไม่มีสิ่งใดในบริการหลักที่จะบรรลุเป้าหมายนี้
niksmac

ไม่เห็น .. คุณอาจเห็นไฟล์ api.php ของโมดูลบริการ
subhojit777

drupal.org/files/endpoint_resources.pngนี่คือบางอย่างเช่น "ไฟล์" ในประเภททรัพยากร
niksmac

ขอโทษ .. ฉันใช้ความช่วยเหลือของการเข้ารหัสในทรัพยากร / file_resource.inc เพื่ออัปโหลดรูปภาพโดยใช้บริการเว็บ .. ฉันลืมที่จะพูดถึงว่ามันใช้เวลานานมากแล้วตั้งแต่ฉันสร้างบริการบนเว็บ
subhojit777

สิ่งหนึ่งที่ฉันสามารถแนะนำคือคุณสามารถเรียกใช้บริการเว็บโดยใช้โปรแกรมจากการโทรกลับบริการเว็บของคุณและรับ $ file array .. แต่มันจะไม่เกินหรือไม่ เรียกบริการเว็บอื่นภายในเว็บ serice
subhojit777

3

ก่อนอื่นตรวจสอบให้แน่ใจว่าในปลายทางของคุณคือเปิดใช้งานไฟล์ -> สร้างทรัพยากร

และใน "ฝั่งลูกค้า" ฉันทำสิ่งนี้:

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

ฉันทำสิ่งนี้จาก Drupal ตัวอื่นและสำหรับ Drupal 6 พอร์ตรหัสไปยัง D7 ควรจะง่ายและฉันคิดว่าคุณได้รับแนวคิดทั่วไปเกี่ยวกับวิธีการทำ


2

บริการปกติ 3 มีจุดสิ้นสุด 'ไฟล์' คุณสามารถเปิดใช้งานการสร้างไฟล์และโพสต์สิ่งนี้ได้ ไฟล์นั้นถูกเข้ารหัสด้วย base-64:

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

2

สำหรับการอัปโหลดภาพคุณจะต้องใช้ชื่อไฟล์และไฟล์เท่านั้น - ซึ่งจะมีการเข้ารหัส base64

คุณสามารถตรวจสอบ repo ของฉันที่นี่ซึ่งคุณสามารถหาคลาสแบบง่าย ๆ สำหรับการทำงานกับ Drupal 7 Rest Services และไฟล์ example.php ซึ่งมีตัวอย่างบางส่วนเกี่ยวกับวิธีใช้คลาส ที่นั่นคุณสามารถหาตัวอย่างเกี่ยวกับวิธีอัปโหลดรูปภาพที่ฉันเพิ่มเมื่อเร็ว ๆ นี้

https://github.com/flesheater/drupal_rest_server_class

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.