メディアモジュールを使用して外部URLからプログラムで画像を追加する方法


20

プログラムで外部URLから画像を追加し、モジュールに画像のローカルコピーを保存して表示させたい。どうやってやるの?通常、新しいノードを作成するときに「メディアを選択」ボタンをクリックしますが、コードを使用してそれを行いたいと思います。

回答:


0

これはあなたの質問に対する部分的な答えです。私は似たようなことをしようとしていますが、ビデオ素材を使っています。

ノードをコンテンツタイプとして作成し、必要なメディアタイプを保存できます(関連するMIME /タイプおよび呼び出す必要がある関数のメディアコードを調べてください)。おそらく、マルチメディアアセットフィールドを設定し、フィールドタイプでメディアファイルセレクターを使用する必要があります。

私が問題を抱えているのは、作成されたノードでブラウザに表示させることですが、現在取り組んでいます。

更新

もう少し手に入れた。メディアAPIを使用してメディアファイルを保存したら、file_usage_add()を使用してファイルIDをノードIDに関連付けます。また、メディアアセットフィールドを作成したときに追加されたフィールドにファイルを関連付ける必要があります。


file_usage_add()を呼び出す必要はありません。tecjamの答えに示されているようなフィールドにファイルを追加するだけです。
デイ

13

php.iniでallow_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のfile_get_contents()関数を使用します

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

そして、Drupal APIのfile_save_data()を使用します

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

そうすれば、大きなファイルに問題はありません。
hugronaphor 14年

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()利用できないサーバーの問題を回避します)?
クライブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.