Cách lưu ảnh bằng Dịch vụ 3


8

Tôi đã tìm thấy một số hướng dẫn rất chi tiết về Dịch vụ 3. Tôi đánh giá cao chúng rất nhiều ở đây là một danh sách nhỏ.

http://drupal.org/node/1354202

Làm cách nào để thêm nhiều hình ảnh vào một nút bằng dịch vụ node.save?

http://drupal.org/node/1699354

Nhưng tôi không thể tìm cách tải hình ảnh từ ứng dụng di động lên máy chủ. Điều đó có thể không ? Tôi có thể lấy ví dụ ở đâu?

Có trong lõi Dịch vụ để thực hiện điều này? Mọi giải pháp có vẻ như tôi cần o mã gì đó để nó hoạt động.


Kiểm tra Gist này .
Muhammad Reda

Câu trả lời:


6

Tôi đã có một yêu cầu một lần như thế này, khi sử dụng dịch vụ web, tôi phải tạo một nút cũng sẽ lưu hình ảnh. Đoạn mã sau tải lên và lưu hình ảnh bằng dịch vụ 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'));
  }
}

LƯU Ý: Mã sau đã được kiểm tra bằng các dịch vụ 3. Ngoài ra, đó là một ứng dụng iOS đang sử dụng dịch vụ web này và nó đã hoạt động ở đó.

LƯU Ý: Tệp được tải lên với yêu cầu POST.

Tôi đã kiểm tra mã trên bằng cách sử dụng plugin Google Chrome có tên REST Console . Để cài đặt tìm kiếm plugin cho "bảng điều khiển nghỉ ngơi" trong Cửa hàng Chrome trực tuyến và cài đặt plugin đầu tiên bạn nhận được (với mũi tên lên màu xanh lục và xanh lam)

Hi vọng điêu nay co ich!


1
Cảm ơn, và bạn có nghĩa là không có gì trong lõi Dịch vụ để đạt được điều này?
niksmac

Chưa thấy .. bạn có thể thấy các tệp api.php của mô-đun dịch vụ
subhojit777

drupal.org/files/endpoint_resource.png ở đây giống như "tập tin" trong loại tài nguyên.
niksmac

xin lỗi .. tôi đã nhờ sự trợ giúp của mã hóa trong resource / file_resource.inc để tải lên hình ảnh bằng dịch vụ web .. Tôi quên đề cập rằng đã lâu rồi kể từ khi tôi tạo dịch vụ web
subhojit777

Một điều tôi có thể đề nghị là bạn có thể gọi dịch vụ web theo chương trình từ cuộc gọi lại dịch vụ web của bạn và lấy mảng tệp $ .. nhưng điều đó có quá tải không? gọi một dịch vụ web khác trong một serice web
subhojit777

3

Trước hết, hãy đảm bảo rằng trong điểm cuối của bạn là bật Tệp -> Tạo tài nguyên.

Và trong "phía khách hàng" tôi đã làm một cái gì đó như thế này:

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

Tôi đã làm điều này từ một Drupal khác, và đối với Drupal 6, việc chuyển mã sang D7 sẽ dễ dàng và tôi nghĩ bạn có ý tưởng chung về cách thực hiện.


2

Các dịch vụ thông thường 3 có điểm cuối 'tập tin'. Bạn chỉ có thể kích hoạt tạo tập tin và đăng một cái gì đó như thế này; bản thân tệp được mã hóa cơ sở 64:

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

2

Để tải lên một hình ảnh, bạn sẽ chỉ cần một tên tệp và một tệp - sẽ được mã hóa base64.

Bạn có thể kiểm tra repo của tôi ở đây , nơi bạn có thể tìm thấy một lớp đơn giản để làm việc với Drupal 7 Rest Services và một tệp example.php trong đó có một số ví dụ về cách sử dụng lớp. Ở đó bạn cũng có thể tìm thấy một ví dụ về cách tải lên một hình ảnh, mà tôi đã thêm gần đây.

https://github.com/f Meateater/drupal_rest_server_group

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.