在Drupal 7中以编程方式将图像文件附加到节点

在Drupal 7中以编程方式将图像文件附加到节点,drupal,drupal-7,Drupal,Drupal 7,是否可以通过编程方式将图像添加到节点?是的,保存时将其作为$node对象的一部分。使用node_Save()保存它。下面是一个示例代码,您可以使用该代码与node_Save()一起使用 $filepath = drupal_realpath('misc/druplicon.png'); // Create managed File object and associate with Image field. $file = (object) array( 'uid' =>

是否可以通过编程方式将图像添加到节点?

是的,保存时将其作为$node对象的一部分。使用node_Save()保存它。

下面是一个示例代码,您可以使用该代码与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;
`
更简单的方法:

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

这里有一点让我有点困惑:这会将图像附加到节点上,如果你正在添加图像,那么你就没事了。但是,如果您正在更新图像,并且希望将其显示在页面上,则在调用node_save()之前需要执行一个额外的步骤:


这将重新生成该图像的所有样式

这就是我的工作原理:

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

$node->field\u image[LANGUAGE\u NONE][0]=(数组)$file

我在一个多语言网站上试过这个。它相当失败。。。但是很可怕。 我必须详细说明有问题的语言。简单地说,这起了作用:

$node->field_image['en'][0]=(数组)$file

如果没有它,附加的文件可以在“查看”屏幕中查看,但不能在“编辑”屏幕中查看。

这对我很有用:

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

我还要将我的解决方案粘贴到这里,我需要创建一个新节点,并以编程方式上传一个图像

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

+1.无论出于何种原因,我还必须将
'display'=>1
添加到$file数组中,否则我会遇到一个约束冲突,即字段\u doc\u file\u display为空。这是针对文件而不是图像,这可能是不同的。有一种方法可以使用此方法向图像添加Alt或Title?如果文件已被某个节点引用,我是否需要使用文件副本将其附加到另一个节点?我还必须添加“'display'=>1”如果你不想复制文件,只想使用已经存在的文件(图像),你可以使用$file=file\u save($file);而不是$file=file_copy($file,'public://');Drupal社区文档提供了稍微不同的方法。它说
file\u usage\u add($file,'file','node',$node->nid)操作。如果不再需要,您可能还需要手动取消临时文件的链接。否则,随着时间的推移,它将累积成为存储空间的巨大浪费。在这种情况下,没有临时文件。图像仅下载到内存中,然后存储在其目标中。
$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);