Drupal 6以编程方式将图像添加到FileField

时间:2011-01-25 12:29:36

标签: php drupal drupal-6 cck

如何以编程方式将图像添加到文件字段?我有一个我希望上传的图像的url / filepath。我尝试过以下方法:

$newNode->field_profile_image[0]['value'] = 'http://www.mysite.com/default.gif';

但它似乎不起作用。

我也尝试过:

$ newNode-> field_profile_image [0] ['value'] ='sites / default / files / default.gif';

该文件不需要在网站外部。我很高兴在相关网站的任何地方都有它。

5 个答案:

答案 0 :(得分:3)

您可能必须使用hook_nodeapi才能正确设置。您将要在“插入”操作下修改它。添加必填字段后,请确保重新节点。

Drupal希望将图像映射到文件表中的条目,因此只需设置URL即可。首先,如果它是远程文件,您可以使用第176行brightcove_remote_image上的Brightcove模块中列出的功能来获取图像并将其移动到本地目录中。

将远程映像移动到位后,需要将其保存到文件表中,然后正确配置节点的属性。我已经用这种方法完成了它:

////// in NodeAPI /////
    case "insert":
        $node->field_image[0] = _mymod_create_filearray($image_url);
        node_save($node);

这将写入文件记录,然后返回格式正确的图像数组。

///// mymod_create_filearray /////
function _mymod_create_filearray($remote_url){
  if ($file_temp = brightcove_remote_image($remote_url)) {
    $file = new stdClass();
    $file->filename = basename($file_temp);
    $file->filepath = $file_temp;
    $file->filemime = file_get_mimetype($file_temp);
    $file->filesize = filesize($file_temp);

    $file->uid = $uid;
    $file->status = FILE_STATUS_PERMANENT;
    $file->timestamp = time();
    drupal_write_record('files', $file);

    $file = array(
     'fid' => $file->fid,
      'title' => basename($file->filename),
      'filename' => $file->filename,
      'filepath' => $file->filepath,
      'filesize' => $file->filesize,
      'mimetype' => $mime,
      'description' => basename($file->filename),
      'list' => 1,
    );
    return $file;
  }
  else {
    return array();
  }
}

那应该这样做。如果您有任何疑问,请告诉我。

答案 1 :(得分:2)

从前一段时间查看my Answersimilar question,我会在其中描述我们如何完全按照您的需要(如果我理解正确的问题)。

重点是使用文件字段模块中的field_file_save_file()函数来附加文件(在hook_nodeapi期间,在操作presave上),这将为您完成大部分工作(或多或少是jacobangel的'_mymod_create_filearray()'尝试做的事情,但更多地关注文件字段的需求,包括验证)。

这假定文件已经存在于服务器文件系统的某个地方(通常在/ tmp中),并且会正确地将其“导入”Drupal,文件表中有相应的条目等。如果你想从远程导入文件URL,您需要添加额外的步骤,首先将它们作为单独的任务/功能提取。

正如上面链接中提到的那样,我最终使用Remote File module中的代码作为自定义实现的示例,因为我们需要一些项目特定的添加 - 也许您可以更直接地将它用于您的目的

答案 2 :(得分:1)

使用nodeapi您应该能够像在代码示例中那样设置值,但仅限于本地图像。您很可能需要在drupal安装中的“files”文件夹中放置图像,但如果设置了它,其他所有内容都应该顺利运行。使用nodeapi时,会发生使用表单保存节点时通常会发生的所有事情,例如更新文件表等。

如果您想使用feeds之类的模块从远程站点提取图像,则可以提取远程图像并创建节点。根据您的使用情况,您可以使用它,或者查看它如何拉动图像并将它们映射到本地文件。

答案 3 :(得分:0)

你尝试的东西不起作用。 Drupal无法在不使用模块的情况下处理远程文件。 AFAIK没有提供API来上传远程文件的模块。

答案 4 :(得分:0)

以下是我的一个项目的快速示例。

  $node = new stdClass;
  $node->title = 'Example Callout';
  $node->type = 'wn_hp_callout';
  // Search examples directory to attach some images.
  $callouts_dir = drupal_get_path('module', 'wn_hp_callout').'/imgs/examples/';
  $callout_imgs = glob($callouts_dir.'*.{jpg,jpeg,png,gif}',GLOB_BRACE);
  // Now add the images and provide imagefield extended additional text.
  foreach($callout_imgs as $img) {
    $img_info = pathinfo($img);
    $field = field_file_save_file($img, array(), file_directory_path() .'/example_callouts/');
    if( !isset($field['data']) ) {
      $field['data'] = array();
    }
    $field['data']['title'] = ucwords(str_replace('_',' ',$img_info['filename']));
    $field['data']['alt'] = 'This is alt text.';
    $node->field_wn_hp_callout_image[] = $field;
   }
   $node = node_submit($node);
   node_save($node);