upload файла через drupal api

Главные вкладки

Аватар пользователя Neumann Neumann 12 декабря 2011 в 15:40

Добрый день.

Подскажите пожалуйста, как программно (через Drupal API) загрузить файл как поле ноды? Нода сама сохраняется через node_save.

Если сделать node_load вручную созданной ноды, то это поле выглядит так

...
[field_superpic] => Array
        (
            [0] => Array
                (
                    [fid] => 1
                    [uid] => 1
                    [filename] => myfile.jpg
                    [filepath] => sites/default/files/myfile.jpg
                    [filemime] => image/jpeg
                    [filesize] => 55701
                    [status] => 1
                    [timestamp] => 1322918679
                    [list] => 1
                    [data] => Array
                        (
                            [alt] =>
                            [title] =>
                        )

                )

        )
...

А вот мне нужно программно и сами файлы находятся в сети.
Первое, что пришло в голову - скачивать файл через file_get_contents, потом fwrite и потом заполнять поля по типу
$node->field_superpic->[0]->filemime = mime_content_type($file);
и т.д. а затем node_save

Но ведь наверное есть и друпаловский способ. Какая-нибудь функция.

Что думаете об этом, господа? Smile

Комментарии

Аватар пользователя Neumann Neumann 12 декабря 2011 в 17:20
<?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 Smile

Вообщем жду и надеюсь на ваши советы! Smile

p.s. посмотрел file_save_upload, но это вроде не то.

Аватар пользователя Neumann Neumann 12 декабря 2011 в 23:45

Спасибо за ответ, но вы наверное немного не поняли.

Если оставить поле $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!

Что делать? Sad

P.S. Нашел пример как к ноде добавить картинку. Там file_copy. Но хотя в 6 версии тоже есть file_copy, работает она по другому. В отличие от той что в 7, она просто копирует файл. А если бы была 7 - то она бы еще делала запись в таблицу файлов. Что мне и нужно было бы. Эх, что ж делать... (((

Такое ощущение, что в 6 функции друпала вообще нет такой возможности работать с объектами файлов и их таблицей в бд (в 6 функции работают с файлами просто как с файлами, т.е. file_copy просто почти как copy из пхп).
Но ведь есть же у загруженных файлов fid (он им необходим). Значит есть и таблица файлов! Значит должен быть способ "регистрации" файлов в системе.

Помогите пожалуйста Sad

Аватар пользователя rimen rimen 13 декабря 2011 в 2:05

Запись в таблицу файлов делаем примерно так (http://drupal.org/node/330421)

// Create file object and update files table
$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 в силу того, что

"rimen" wrote:
он автоинкрементом создастся новый.