如何以编程方式将图像添加到文件字段?我有一个我希望上传的图像的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';
该文件不需要在网站外部。我很高兴在相关网站的任何地方都有它。
答案 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 Answer到similar 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);