【问题标题】:Attaching image files to nodes programmatically in Drupal 7在 Drupal 7 中以编程方式将图像文件附加到节点
【发布时间】:2011-02-26 20:32:47
【问题描述】:

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

【问题讨论】:

    标签: drupal drupal-7


    【解决方案1】:

    这是一个示例代码,您可以使用它与 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;
    `
    

    【讨论】:

    • +1。无论出于何种原因,我还必须将'display' => 1 添加到 $file 数组,否则我会违反约束,即 field_doc_file_display 为 NULL。这是用于文件而不是图像,这可能是不同的。
    • 有没有办法用这个方法给图片添加Alt或Title?
    • 如果文件已经被某个节点引用,是否需要使用file_copy将其附加到另一个节点?
    • 我还必须添加“'display' => 1”才能使其正常工作。
    • 如果您不想复制文件而只使用已经存在的文件(图像),您可以使用 $file = file_save($file);而不是 $file = file_copy($file, 'public://');
    【解决方案2】:

    更简单的方法:

    $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】:

      这对我有用:

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

      【讨论】:

      • Drupal 社区文档提供了稍微不同的方法来执行此操作。 drupal.org/node/2301425 。它说file_usage_add($file, 'file', 'node', $node->nid); 在执行此操作时也必须完成。
      • 如果不再需要,您可能还想手动取消链接临时文件。否则,随着时间的推移,它会积累起来,成为存储空间的巨大浪费。
      • 这种情况下没有临时文件。图像仅被下载到内存中,然后存储在其目标位置。
      【解决方案4】:

      这里有一点让我很困惑:这会将图像附加到节点上,如果您要添加图像,那么您就可以了。但是,如果您正在更新图像,并且您关心在页面上显示它,那么在调用 node_save() 之前需要一个额外的步骤:

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

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

      【讨论】:

        【解决方案5】:

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

        我在一个多语言网站上进行了尝试。它相当失败......但非常可怕。 我必须指定有问题的语言。简而言之,这是可行的:

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

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

        【讨论】:

          【解决方案6】:

          是的,当你保存它时让它成为 $node 对象的一部分。使用 node_save() 保存它。

          【讨论】:

            【解决方案7】:

            这对我有用:

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

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-01-04
                • 2022-08-12
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多