Як програмно додати зображення із зовнішньої URL-адреси за допомогою медіа-модуля?


20

Я хочу програмно додати зображення із зовнішньої URL-адреси, щоб модуль зберігав і відображав локальну копію зображення. Як я можу це зробити? Зазвичай я натискав би кнопку "вибрати медіа" під час створення нового вузла, але хочу це зробити за допомогою коду.

Відповіді:


0

Це часткова відповідь на ваше запитання, оскільки я намагаюся зробити щось подібне, але з відеоматеріалом.

Ви можете створити вузол як тип вмісту, зберегти потрібний тип носія (ознайомтеся з медіа-кодом відповідних mime / type та функцій, які потрібно викликати). Можливо, вам буде потрібно встановити поле мультимедійного ресурсу та використовувати селектор мультимедійних файлів у полі поля.

Біт, з яким я маю проблему, - це змусити браузер показати його у створеному вузлі, однак над цим я зараз працюю.

ОНОВЛЕННЯ

Потрапивши трохи далі. Після того як ви зберегли медіа-файл (за допомогою медіа API), асоціюйте ідентифікатор файла з ідентифікатором вузла за допомогою file_usage_add () . Можливо, вам також знадобиться пов’язати файл із полем, доданим під час створення поля медіа-активів.


Вам не потрібно дзвонити file_usage_add (). Вам просто потрібно додати файл до поля, яке показано у відповіді tecjam.
Дейв Рейд

13

Переконайтеся, що ваш php.ini дозволяє дозволити_url_fopen. Тоді ви можете використовувати щось подібне у своєму модулі:

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

Використовуйте функцію php's file_get_contents ()

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

а потім використовуйте файл_save_data () API Drupal API ()

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

Тоді ви повинні мати можливість викликати його за допомогою та зберегти його у вузлі тощо.

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

Редагувати:

Як зазначено в коментарях, ви можете використовувати функцію system_retrieve_file Див.: Https://api.drupal.org/api/drupal/modules!system!system.module/function/system_retrieve_file/7


8
Насправді для цього є кращий API: system_retrieve_file () $file = system_retrieve_file('http://drupal.org/files/issues/druplicon_2.png', NULL, TRUE, FILE_EXISTS_RENAME);
Дейв Рейд

6

Ось мій робочий приклад.

$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;
}

Чому ви створюєте тимчасовий файл із system_retrieve_file()і потім зберігаєте його як постійний FILE_STATUS_PERMANENT? Я не бачу сенсу вашої користувацької функції?
mpdonadio

Таким чином - у мене немає проблем з великими файлами.
хугронафор

1

Це не пряма відповідь, але переконайтесь, що ви вже знаєте про модуль Filefield Sources , який робить це для зображень взагалі. Це може задовольнити ваші потреби самостійно; Я не знаю, чи корисно це для Media.


0

На додаток до відповіді @tecjam: вам слід використовувати drupal_http_request () замість file_get_contents () , це дає вам більше контролю над процесом. Але в цілому цей метод працює як очікувалося.


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;

Будь-яка причина використовувати цей метод більше system_retrieve_file()(що це все для вас і уникає проблем із серверами, де file_get_contents()немає)?
Клайв
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.