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.

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.


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


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

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.


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.


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;

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.