Wie füge ich ein Bild von einer externen URL mit dem Medienmodul programmgesteuert hinzu?

20

Ich möchte programmgesteuert ein Bild von einer externen URL hinzufügen und das Modul eine lokale Kopie des Bildes speichern und anzeigen lassen. Wie kann ich das machen? Normalerweise würde ich beim Erstellen eines neuen Knotens auf die Schaltfläche "Medium auswählen" klicken, aber ich möchte dies über Code tun.

Matthew Hui
quelle

Antworten:

0

Dies ist eine teilweise Antwort auf Ihre Frage, da ich versuche, etwas Ähnliches zu tun, aber mit Videomaterial.

Sie können den Knoten als Inhaltstyp erstellen und den gewünschten Medientyp speichern (sehen Sie sich den Mediencode für den entsprechenden Mime / Typ und die Funktionen an, die Sie aufrufen müssen). Möglicherweise müssen Sie ein Multimedia-Medienfeld festlegen und die Mediendateiauswahl im Feldtyp verwenden.

Das Problem, mit dem ich ein Problem habe, besteht darin, dass der Browser es auf dem erstellten Knoten anzeigt, an dem ich gerade arbeite.

AKTUALISIEREN

Etwas weiter gekommen. Wenn Sie die Mediendatei gespeichert haben (mithilfe der Medien-API), ordnen Sie die Datei-ID mit file_usage_add () der Knoten-ID zu . Möglicherweise müssen Sie die Datei auch dem Feld zuordnen, das Sie beim Erstellen des Medienassetfelds hinzugefügt haben.

ipe
quelle
Sie müssen file_usage_add () nicht aufrufen. Sie müssen nur die Datei zu einem Feld hinzufügen, wie in der Antwort von tecjam gezeigt.
Dave Reid
13

Stellen Sie sicher, dass Ihre php.ini allow_url_fopen zulässt. Dann können Sie so etwas in Ihrem Modul verwenden:

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

Verwenden Sie die Funktion file_get_contents () von php

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

und dann Drupal API file_save_data () verwenden

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

Dann sollten Sie in der Lage sein, es mit aufzurufen und es auf einem Knoten usw. zu speichern.

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

Bearbeiten:

Wie in den Kommentaren erwähnt, können Sie die Funktion system_retrieve_file verwenden. Siehe: https://api.drupal.org/api/drupal/modules!system!system.module/function/system_retrieve_file/7

Tecjam
quelle
8
Tatsächlich gibt es eine bessere API dafür: system_retrieve_file () $file = system_retrieve_file('http://drupal.org/files/issues/druplicon_2.png', NULL, TRUE, FILE_EXISTS_RENAME);
Dave Reid
6

Hier ist mein Arbeitsbeispiel.

$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;
}
Hugronapher
quelle
Warum erstellen Sie eine temporäre Datei mit dem system_retrieve_file()und speichern sie dann als permanente Datei in FILE_STATUS_PERMANENT? Ich verstehe den Sinn Ihrer benutzerdefinierten Funktion nicht?
mpdonadio
Auf diese Weise habe ich keine Probleme mit großen Dateien.
Hugronaphor
1

Dies ist keine direkte Antwort, aber stellen Sie sicher, dass Sie bereits über das Filefield Sources- Modul informiert sind , das dies für Bilder im Allgemeinen tut. Es könnte Ihre Bedürfnisse von selbst befriedigen; Ich weiß nicht, ob es für Medien nützlich ist.

rfay
quelle
0

Als Ergänzung zur @tecjam-Antwort: Sie sollten drupal_http_request () anstelle von file_get_contents () verwenden , um mehr Kontrolle über den Prozess zu erhalten. Insgesamt funktioniert diese Methode jedoch wie erwartet.

Kirill Roskolii
quelle
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
quelle
Gibt es einen Grund, diese Methode zu verwenden system_retrieve_file()(was macht alles für Sie und vermeidet Probleme mit Servern, auf denen file_get_contents()keine verfügbar sind)?
Clive