2011-02-26 14 views

Respuesta

50

Aquí es un ejemplo de código con el que se puede utilizar con node_save

$filepath = drupal_realpath('misc/druplicon.png'); 
    // Create managed File object and associate with Image field. 
    $file = (object) array(
    'uid' => 1, 
    'uri' => $filepath, 
    'filemime' => file_get_mimetype($filepath), 
    'status' => 1, 
); 

    // We save the file to the root of the files directory. 
    $file = file_copy($file, 'public://'); 

    $node->field_image[LANGUAGE_NONE][0] = (array)$file; 
` 
+4

+1. Por alguna razón, también tuve que agregar ''visualizar '=> 1' a la matriz de archivos $, o si no, recibí una violación de restricción que field_doc_file_display era NULL. Esto fue para un archivo en lugar de una imagen, lo que podría ser la diferencia. – feedbackloop

+0

¿Hay alguna forma de agregar Alt o Título a la imagen con este método? – Shyghar

+2

+1 para LANGUAGE_NONE – saadlulu

0

Sí, hágalo parte del objeto $ node cuando lo guarde. Guárdalo usando node_save().

30

Una forma más fácil:

$filename = 'image.txt'; 
$image = file_get_contents('http://www.ibiblio.org/wm/paint/auth/gogh/gogh.white-house.jpg'); 
$file = file_save_data($image, 'public://' . $filename, FILE_EXISTS_RENAME); 
$node->field_image = array(LANGUAGE_NONE => array('0' => (array)$file)); 
3

Aquí hay un poco más que me hizo tropezar por un tiempo Esto adjuntará la imagen al nodo, y si está agregando la imagen, entonces está bien. Sin embargo, si usted es actualizar una imagen, y que se preocupan por mostrarla en una página, entonces se necesita un paso adicional antes de llamar node_save():

image_path_flush($node->field_image['und'][0]['uri']); 

Esto se regenerará todas Estilos de esa imagen.

6

Esto es lo que funcionó para mí:

$file_temp = file_get_contents('public://someimage.jpg'); 

// Saves a file to the specified destination and creates a database entry. 
$file_temp = file_save_data($file_temp, 'public://' . 'someimage.jpg', FILE_EXISTS_RENAME); 

$node->field_page_image = array(
    'und' => array(
    0 => array(
     'fid' => $file_temp->fid, 
     'filename' => $file_temp->filename, 
     'filemime' => $file_temp->filemime, 
     'uid' => 1, 
     'uri' => $file_temp->uri, 
     'status' => 1, 
     'display' => 1 
    ) 
) 
); 
+0

La documentación de la comunidad de Drupal brinda una forma ligeramente diferente de hacerlo. https://www.drupal.org/node/2301425. Dice que 'file_usage_add ($ file, 'file', 'node', $ node-> nid);' también debe hacerse al hacer esto. – rineez

+1

Es posible que también desee desvincular manualmente el archivo temporal, si ya no es necesario. De lo contrario, se acumulará y se convertirá en una gran pérdida de espacio de almacenamiento a lo largo del tiempo. – rineez

+0

No hay un archivo temporal en este caso. La imagen se está descargando a la memoria solamente, luego se almacena en su destino de destino. – Brian

2

$node->field_image[LANGUAGE_NONE][0] = (array)$file;

He intentado esto con un sitio multilingüe. Falló bastante ... pero horriblemente. Tuve que especificar el idioma en cuestión. En pocas palabras, esto funcionó en su lugar:

$node->field_image['en'][0] = (array)$file;

Sin él, el archivo adjunto era visible en la pantalla de 'vista', pero no en la pantalla 'Editar'.

0

Esto funciona para mí:

define('DRUPAL_ROOT', $_SERVER['DOCUMENT_ROOT']); 
require_once DRUPAL_ROOT . '/includes/bootstrap.inc'; 
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); 

$node = node_load(99); 
$filename = 'image.txt'; 
chdir(DRUPAL_ROOT); 
$image = file_get_contents('http://www.ibiblio.org/wm/paint/auth/gogh/gogh.white-house.jpg'); 
$file = file_save_data($image, 'public://' . $filename, FILE_EXISTS_RENAME); 
$node->field_imagen_producto = array(LANGUAGE_NONE => array('0' => (array)$file)); 
node_save($node); 
0

Sólo va a pegar mi solución aquí también, que necesitaba para crear un nuevo nodo, y subir una imagen mediante programación.

$filepath = variable_get('file_public_path') . '/xmas_banner.jpg'; 
$file_temp = file_get_contents($filepath); 
$file_temp = file_save_data($file_temp, file_default_scheme() . '://' .'xmas_banner_nl.jpg', FILE_EXISTS_RENAME); 

$node = new stdClass(); 
$node->type = 'carousel'; // custom content type 
$node->title = 'XMAS NL'; 
$node->field_banner_image[LANGUAGE_NONE][0] = (array) $file_temp; 
$node->uid = 1; 
$node->status = 0; 
$node->active = 0; 
$node->promote = 0; 
node_save($node); 
Cuestiones relacionadas