Добрый день.
Подскажите пожалуйста, как программно (через Drupal API) загрузить файл как поле ноды? Нода сама сохраняется через node_save.
Если сделать node_load вручную созданной ноды, то это поле выглядит так
А вот мне нужно программно и сами файлы находятся в сети.
Первое, что пришло в голову - скачивать файл через file_get_contents, потом fwrite и потом заполнять поля по типу
$node->field_superpic->[0]->filemime = mime_content_type($file);
и т.д. а затем node_save
Но ведь наверное есть и друпаловский способ. Какая-нибудь функция.
Что думаете об этом, господа?
Комментарии
<?php
$temp = file_get_contents($full_path_file);
$full_path_upload = "sites/default/files/".$file_name;
$f = fopen($full_path_upload, 'w');
if (
$count_of_bytes = fwrite($f, $temp) ){
$node->field_superpic[0]['fid'] = 30;
$node->field_superpic[0]['uid'] = 1;
$node->field_superpic[0]['filename'] = $file_name;
$node->field_superpic[0]['filepath'] = $full_path_upload;
$node->field_superpic[0]['filemime'] = mime_content_type($full_path_upload);
$node->field_superpic[0]['filesize'] = $count_of_bytes;
$node->field_superpic[0]['timestamp'] = time();
$node->field_superpic[0]['list'] = 1;
$node->field_superpic[0]['status'] = 0;
} else die ("error");
/*
...
другие поля
...
*/
node_save($node);
?>
В общем так. Работает.
Но все-таки вопрос остается открытым - есть ли друпаловский способ для этого?
Потому что, к примеру, непонятно, как определять fid файла. Здесь я сделал 30, но на сайте у каждого файла этот ключ уникальный и непонятно как это обеспечивать в реальных условиях - когда файлы загружаются не только через мой способ, но и традиционным способом. Может быть есть какой-то get_new_fid
Вообщем жду и надеюсь на ваши советы!
p.s. посмотрел file_save_upload, но это вроде не то.
если fid не указать, тоон автоинкрементом создастся новый. (аналогично nid в нодах)бес попутал
Спасибо за ответ, но вы наверное немного не поняли.
Если оставить поле $node->field_superpic[0]['fid'] пустым, то нода создастся, но всё поле $node->field_superpic[0] будет пустым, как будто вообще не было заполнено.
Если же заполнить это поле каким-то числом, например, 33, то всё ок! Но ведь в таблице файлов друпала нет этого файла! Как я понимаю. И этот fid произвольный.
Я так понимаю, что нужно сначала сохранить файл на сайте, чтобы он оказался в таблице файлов и ему был присвоен fid. И тогда уже, с полным правом можно указывать это в $node->field_superpic[0]['fid'].
file_save_upload, про который я думал раньше оказался для другого - он работает с $_FILES, а у меня другое.
Потом я подумал, что для этого нужно применять file_save(), но не получается.
Пока писал эти строки, обратил внимание, что file_save появился только в 7 версии Друпала! А у меня 6!
Что делать?
P.S. Нашел пример как к ноде добавить картинку. Там file_copy. Но хотя в 6 версии тоже есть file_copy, работает она по другому. В отличие от той что в 7, она просто копирует файл. А если бы была 7 - то она бы еще делала запись в таблицу файлов. Что мне и нужно было бы. Эх, что ж делать... (((
Такое ощущение, что в 6 функции друпала вообще нет такой возможности работать с объектами файлов и их таблицей в бд (в 6 функции работают с файлами просто как с файлами, т.е. file_copy просто почти как copy из пхп).
Но ведь есть же у загруженных файлов fid (он им необходим). Значит есть и таблица файлов! Значит должен быть способ "регистрации" файлов в системе.
Помогите пожалуйста
Запись в таблицу файлов делаем примерно так (http://drupal.org/node/330421)
$file = new stdClass();
$file->filename = basename($file_drupal_path);
$file->filepath = $file_drupal_path;
$file->filemime = mime_content_type($file_drupal_path);
$file->filesize = filesize($file_drupal_path);
$file->uid = $user->uid;
$file->timestamp = time();
drupal_write_record('files', $file);
после сия действа в $file->fid будет нужный файл id в силу того, что
Спасибо, это то, что нужно