Come aggiungere a livello di codice immagine da URL esterno utilizzando il modulo multimediale?


20

Voglio aggiungere a livello di codice un'immagine da un URL esterno e fare in modo che il modulo memorizzi e visualizzi una copia locale dell'immagine. Come lo posso fare? Normalmente, farei clic sul pulsante "seleziona media" durante la creazione di un nuovo nodo, ma voglio farlo tramite il codice.

Risposte:


0

Questa è una risposta parziale alla tua domanda, poiché sto cercando di fare qualcosa di simile ma con materiale video.

È possibile creare il nodo come tipo di contenuto, salvare il tipo di supporto necessario (consultare il codice media per il mime / tipo e le funzioni pertinenti che è necessario chiamare). Probabilmente dovrai impostare un campo di risorse multimediali e utilizzare il selettore di file multimediali nel tipo di campo.

Il bit con cui sto riscontrando un problema è far sì che il browser lo mostri nel nodo creato, su cui sto attualmente lavorando.

AGGIORNARE

Avere ottenuto un po 'di più. Dopo aver salvato il file multimediale (utilizzando l'API multimediale), associare l'id del file all'ID nodo utilizzando file_usage_add () . Probabilmente dovrai anche associare il file nel campo aggiunto quando hai creato il campo dell'asset multimediale.


Non è necessario chiamare file_usage_add (). Devi solo aggiungere il file a un campo come mostrato nella risposta di tecjam.
Dave Reid,

13

Assicurati che php.ini consenta allow_url_fopen. Quindi puoi usare qualcosa del genere nel tuo modulo:

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

Usa la funzione file_get_contents () di php

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

e quindi usa l'API Drupal file_save_data ()

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

Quindi dovresti essere in grado di chiamarlo usando e salvarlo su un nodo ecc.

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

Modificare:

Come sottolineato nei commenti, è possibile utilizzare la funzione system_retrieve_file Vedere: https://api.drupal.org/api/drupal/modules!system!system.module/function/system_retrieve_file/7


8
In realtà esiste un'API migliore per questo: system_retrieve_file () $file = system_retrieve_file('http://drupal.org/files/issues/druplicon_2.png', NULL, TRUE, FILE_EXISTS_RENAME);
Dave Reid,

6

Ecco il mio esempio di lavoro.

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

Perché stai creando un file temporaneo con system_retrieve_file()e quindi salvandolo come permanente in FILE_STATUS_PERMANENT? Non vedo il punto della tua funzione personalizzata?
mpdonadio

In questo modo - non ho problemi con file di grandi dimensioni.
Hugronaphor,

1

Questa non è una risposta diretta, ma assicurati di conoscere già il modulo Sorgenti Filefield , che lo fa per le immagini in generale. Potrebbe soddisfare le tue esigenze da solo; Non so se sia utile con Media.



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;

Qualche motivo per usare questo metodo system_retrieve_file()(che fa tutto per te ed evita problemi con i server dove file_get_contents()non è disponibile)?
Clive
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.