Bagaimana cara menambahkan gambar dari URL eksternal menggunakan modul media?

20

Saya ingin secara terprogram menambahkan gambar dari URL eksternal dan memiliki modul store dan menampilkan salinan gambar lokal. Bagaimana saya bisa melakukan itu? Biasanya, saya akan mengklik tombol "pilih media" sambil membuat simpul baru tapi saya ingin melakukannya melalui kode.

Matthew Hui
sumber

Jawaban:

0

Ini adalah sebagian jawaban untuk pertanyaan Anda, karena saya mencoba melakukan sesuatu yang serupa tetapi dengan materi video.

Anda dapat membuat simpul sebagai tipe konten, simpan jenis media yang Anda butuhkan (lihat kode media untuk mengetahui mime / jenis yang relevan dan fungsi yang perlu Anda panggil). Anda mungkin perlu mengatur bidang aset multimedia dan menggunakan pemilih file media dalam jenis bidang tersebut.

Bit yang saya punya masalah adalah membuat browser untuk menunjukkannya di node yang dibuat, yang saat ini saya kerjakan.

MEMPERBARUI

Setelah mendapat sedikit lebih jauh. Setelah Anda menyimpan file media (menggunakan media API), kaitkan id file dengan ID node menggunakan file_usage_add () . Anda mungkin juga harus mengaitkan file di bidang yang ditambahkan saat Anda membuat bidang aset media.

ipe
sumber
Anda tidak perlu memanggil file_usage_add (). Anda hanya perlu menambahkan file ke bidang seperti ditunjukkan dalam jawaban tecjam.
Dave Reid
13

Pastikan php.ini Anda mengizinkan allow_url_fopen. Kemudian Anda dapat menggunakan sesuatu seperti ini di modul Anda:

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

Gunakan fungsi file_get_contents () php

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

dan kemudian gunakan file_save_data API Drupal ()

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

Maka Anda harus dapat menyebutnya menggunakan dan menyimpannya ke node dll.

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

Edit:

Seperti yang ditunjukkan dalam komentar, Anda dapat menggunakan fungsi system_retrieve_file Lihat: https://api.drupal.org/api/drupal/modules!system!system.module/function/system_retrieve_file/7

tecjam
sumber
8
Sebenarnya ada API yang lebih baik untuk ini: system_retrieve_file () $file = system_retrieve_file('http://drupal.org/files/issues/druplicon_2.png', NULL, TRUE, FILE_EXISTS_RENAME);
Dave Reid
6

Ini contoh kerja saya.

$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;
}
hugronafor
sumber
Mengapa Anda membuat file sementara dengan system_retrieve_file()dan kemudian menyimpannya sebagai file permanen FILE_STATUS_PERMANENT? Saya tidak melihat titik fungsi kustom Anda?
mpdonadio
Dengan cara itu - saya tidak punya masalah dengan file besar.
hugronaphor
1

Ini bukan jawaban langsung, tetapi pastikan Anda sudah tahu tentang modul Sumber Filefield , yang melakukan ini untuk gambar secara umum. Mungkin memenuhi kebutuhan Anda sendiri; Saya tidak tahu apakah ini berguna dengan Media.

rfay
sumber
0

Sebagai tambahan jawaban @tecjam: Anda harus menggunakan drupal_http_request () alih-alih file_get_contents () , itu memberi Anda lebih banyak kontrol atas proses. Tetapi secara total metode ini berfungsi seperti yang diharapkan.

Kirill Roskolii
sumber
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;
mrded
sumber
Adakah alasan untuk menggunakan metode itu system_retrieve_file()(yang melakukan semuanya untuk Anda dan menghindari masalah dengan server file_get_contents()yang tidak tersedia)?
Clive