Medya modülünü kullanarak harici URL'den programlı olarak resim nasıl eklenir?


20

Programlı olarak harici bir URL'den resim eklemek ve modülün resmin yerel bir kopyasını depolamasını ve görüntülemesini istiyorum. Bunu nasıl yapabilirim? Normalde, yeni bir düğüm oluştururken "medya seç" düğmesini tıklıyorum ama kodla yapmak istiyorum.

Yanıtlar:


0

Bu, video materyali ile benzer bir şey yapmaya çalıştığım için sorunuzun kısmi bir cevabı.

Düğümü bir içerik türü olarak oluşturabilir, ihtiyacınız olan ortam türünü kaydedebilirsiniz (çağırmanız gereken ilgili mime / tür ve işlevler için ortam koduna göz atabilirsiniz). Muhtemelen bir multimedya varlık alanı ayarlamanız ve alan türünde medya dosyası seçiciyi kullanmanız gerekecektir.

Bir sorun yaşadığım bit, tarayıcıyı şu anda üzerinde çalıştığım, oluşturulan düğümde göstermeye başlıyor.

GÜNCELLEME

Biraz daha ileriye sahip olmak. Medya dosyasını kaydettikten sonra (media API kullanarak), file_usage_add () öğesini kullanarak dosya kimliğini düğüm kimliğiyle ilişkilendirin . Ayrıca medya varlık alanını oluşturduğunuzda, eklenen alanda dosyayı ilişkilendirmeniz gerekir.


File_usage_add () öğesini çağırmanıza gerek yoktur. Tek yapmanız gereken dosyayı tecjam cevabında gösterildiği gibi bir alana eklemektir.
Dave Reid

13

Php.ini dosyanızın allow_url_fopen işlevine izin verdiğinden emin olun. Sonra modülünüzde böyle bir şey kullanabilirsiniz:

$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'nin file_get_contents () işlevini kullanın

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

ve ardından Drupal API'sinin file_save_data () yöntemini kullanın

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

Sonra onu kullanarak aramak ve bir düğüm vb kaydetmek gerekir.

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

Düzenle:

Yorumlarda belirtildiği gibi system_retrieve_file işlevini kullanabilirsiniz Bkz. Https://api.drupal.org/api/drupal/modules!system!system.module/function/system_retrieve_file/7


8
Aslında bunun için daha iyi bir API var: system_retrieve_file () $file = system_retrieve_file('http://drupal.org/files/issues/druplicon_2.png', NULL, TRUE, FILE_EXISTS_RENAME);
Dave Reid

6

İşte benim çalışma örneğim.

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

Neden ile geçici bir dosya oluşturup system_retrieve_file()kalıcı dosya olarak kaydediyorsunuz FILE_STATUS_PERMANENT? Özel fonksiyonunuzun amacını görmüyorum?
mpdonadio

Bu şekilde - büyük dosyalarla ilgili sorunum yok.
Ocak'ta hugronaphor

1

Bu doğrudan bir yanıt değil, ancak genel olarak görüntüler için bunu yapan Filefield Sources modülü hakkında bilgi sahibi olduğunuzdan emin olun . İhtiyaçlarınızı kendi başına karşılayabilir; Medya ile faydalı olup olmadığını bilmiyorum.


0

@Tecjam cevabına ek olarak: file_get_contents () yerine drupal_http_request () kullanmanız gerekir , bu size süreç üzerinde daha fazla kontrol sağlar. Ancak toplamda bu yöntem beklendiği gibi çalışır.


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;

Bu yöntemi kullanmak için herhangi bir neden system_retrieve_file()(hepsi sizin için yapar ve file_get_contents()mevcut olmayan sunucularla ilgili sorunları önler )?
Clive
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.