Làm cách nào để lập trình thêm hình ảnh từ URL bên ngoài bằng mô-đun phương tiện?


20

Tôi muốn lập trình thêm một hình ảnh từ một URL bên ngoài và có mô-đun lưu trữ và hiển thị một bản sao của hình ảnh cục bộ. Làm thế nào tôi có thể làm điều đó? Thông thường, tôi sẽ nhấp vào nút "chọn phương tiện" trong khi tạo một nút mới nhưng tôi muốn thực hiện thông qua mã.

Câu trả lời:


0

Đây là một câu trả lời một phần cho câu hỏi của bạn, vì tôi đang cố gắng làm điều gì đó tương tự nhưng với tài liệu video.

Bạn có thể tạo nút dưới dạng loại nội dung, lưu loại phương tiện bạn cần (xem qua mã phương tiện cho mime / loại và các chức năng có liên quan mà bạn cần gọi). Bạn có thể sẽ cần phải đặt trường nội dung đa phương tiện và sử dụng bộ chọn tệp phương tiện trong loại trường.

Mặc dù vậy, vấn đề tôi gặp phải là trình duyệt hiển thị nó trong nút đã tạo, hiện tôi đang làm việc.

CẬP NHẬT

Có thêm một chút. Khi bạn đã lưu tệp phương tiện (sử dụng API phương tiện), hãy liên kết id tệp với ID nút bằng file_usage_add () . Có lẽ bạn cũng cần liên kết tệp trong trường được thêm khi bạn tạo trường nội dung phương tiện.


Bạn không cần gọi file_usage_add (). Bạn chỉ cần thêm tệp vào một trường như được hiển thị trong câu trả lời của tecjam.
Dave Reid

13

Đảm bảo php.ini của bạn cho phép allow_url_fopen. Sau đó, bạn có thể sử dụng một cái gì đó như thế này trong mô-đun của bạn:

$image = file_get_contents('http://drupal.org/files/issues/druplicon_2.png'); // string
$file = file_save_data($image, 'public://druplicon.png',FILE_EXISTS_REPLACE);

Sử dụng hàm file_get_contents () của php

http://www.php.net/manual/en/feft.file-get-contents.php

và sau đó sử dụng file_save_data () của Drupal API

http://api.drupal.org/api/drupal/includes--file.inc/feft/file_save_data/7

Sau đó, bạn sẽ có thể gọi nó bằng cách sử dụng và lưu nó vào một nút, v.v.

$node = new stdClass;
$node->type = 'node_type';
node_object_prepare($node);
$node->field_image[LANGUAGE_NONE]['0']['fid'] = $file->fid;
node_save($node);

Chỉnh sửa:

Như đã chỉ ra trong các nhận xét, bạn có thể sử dụng hàm system_retrieve_file Xem: https://api.drupal.org/api/drupal/modules!system!system.module/feft/system_retrieve_file/7


8
Trên thực tế, có một API tốt hơn cho việc này: system_retrieve_file () $file = system_retrieve_file('http://drupal.org/files/issues/druplicon_2.png', NULL, TRUE, FILE_EXISTS_RENAME);
Dave Reid

6

Dưới đây là ví dụ làm việc của tôi.

$remoteDocPath = 'http://drupal.org/files/issues/druplicon_2.png';
$doc = system_retrieve_file($remoteDocPath, NULL, FALSE, FILE_EXISTS_REPLACE);
$file = drupal_add_existing_file($doc);

$node = new stdClass;
$node->type = 'node_type';
node_object_prepare($node);
$node->field_image[LANGUAGE_NONE]['0']['fid'] = $file->fid;
node_save($node);

function drupal_add_existing_file($file_drupal_path, $uid = 1, $status = FILE_STATUS_PERMANENT) {
  $files = file_load_multiple(array(), array('uri' => $file_drupal_path));
  $file = reset($files);

  if (!$file) {
    $file = (object) array(
        'filename' => basename($file_drupal_path),
        'filepath' => $file_drupal_path,
        'filemime' => file_get_mimetype($file_drupal_path),
        'filesize' => filesize($file_drupal_path),
        'uid' => $uid,
        'status' => $status,
        'timestamp' => time(),
        'uri' => $file_drupal_path,
    );
    drupal_write_record('file_managed', $file);
  }
  return $file;
}

Tại sao bạn tạo một tệp tạm thời với system_retrieve_file()và sau đó lưu nó dưới dạng vĩnh viễn FILE_STATUS_PERMANENT? Tôi không thấy điểm của chức năng tùy chỉnh của bạn?
mpdon Arena

Theo cách đó - tôi không gặp vấn đề với các tệp lớn.
hugronaphor

1

Đây không phải là câu trả lời trực tiếp, nhưng hãy đảm bảo rằng bạn đã biết về mô-đun Nguồn trường , trường này thực hiện điều này cho hình ảnh nói chung. Nó có thể tự đáp ứng nhu cầu của bạn; Tôi không biết nếu nó hữu ích với Media.


0

Ngoài câu trả lời @tecjam: bạn nên sử dụng drupal_http_Vquest () thay vì file_get_contents () , nó cho phép bạn kiểm soát nhiều hơn quá trình. Nhưng trong tổng số phương pháp này hoạt động như mong đợi.


0
// This is a PHP function to get a string representation of the image file.
$image = file_get_contents($path); 

// A stream wrapper path where you want this image to reside on your file system including the desired filename.
$destination = 'public://path/to/store/this/image/name.jpg'; 

$file = file_save_data($image, $destination, FILE_EXISTS_REPLACE);

if (is_object($file)) { // if you get back a Drupal $file object, everything went as expected so make the status permenant
  $file->status = 1;
  $file = file_save($file);
}

return $file;

Bất kỳ lý do nào để sử dụng phương pháp system_retrieve_file()đó (tất cả đều phù hợp với bạn và tránh các vấn đề với máy chủ file_get_contents()không khả dụng)?
Clive
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.