2009-10-29 2 views
2

Я занимаюсь созданием функции массовой загрузки для сайта Drupal. Используя flash, я могу загрузить файлы на определенный URL-адрес, который затем обрабатывает файлы. То, что я хочу сделать, - это не просто загрузить файлы, но создать узел определенного типа с файлом, сохраненным в файловое поле, которое было настроено с помощью CCK. Поскольку это аудиофайлы, важно, чтобы файловое поле обрабатывало файлы, поэтому метаданные добавления могут быть снабжены модулем getid3.Сохранение узлов с файловым полем

Теперь я просмотрел некоторые из кода, поскольку мне не удалось найти документацию по API, но не совсем ясно, как мне с этим справиться. В идеале я мог просто передать файл функции и просто использовать данные, возвращаемые при сохранении узла, но я не смог найти эту функцию.

Если у кого-то есть опыт с этим, я бы оценил некоторые указания относительно того, как подойти к этому вопросу.

ответ

8

Я должен был сделать что-то подобное несколько недель назад и в конечном итоге адаптировал некоторые функции от Remote File module, особенно функцию remote_file_cck_attach_file(). Он использует функцию field_file_save_file() из модуля файлового поля, который может быть функцией, которую вы ищете.

В моем случае файлы извлекаются из нескольких удаленных мест и временно сохраняются с использованием file_save_data(). Присоединение их к CCK FileField происходит на hook_nodeapi() presave, используя следующее:

public static function attachAsCCKField(&$node, $filepath, $fieldname, $index=0) { 
    // Grab the filefield definition 
    $field = content_fields($fieldname, $node->type); 
    $validators = array_merge(filefield_widget_upload_validators($field), imagefield_widget_upload_validators($field)); 
    $fieldFileDirectory = filefield_widget_file_path($field); 
    // This path does not necessarily exist already, so make sure it is available 
    self::verifyPath($fieldFileDirectory); 
    $file = field_file_save_file($filepath, $validators, $fieldFileDirectory); 
    // Is the CCK field array already available in the node object? 
    if (!is_array($node->$fieldname)) { 
    // No, add a stub 
    $node->$fieldname=array(); 
    } 
    $node->{$fieldname}[$index] = $file; 
} 

$filepath путь к файлу, который должен быть присоединен, $fieldname это внутреннее имя FileField экземпляра для использования в узле и $index будет индекс на основе 0 прикрепленного файла в случае нескольких записей полей.

Функция оказалась в классе утилиты, поэтому синтаксис класса для вызова verifyPath(). Звонок просто гарантирует, что целевой каталог доступен:

public static function verifyPath($path) { 
    if (!file_check_directory($path, FILE_CREATE_DIRECTORY)) { 
    throw new RuntimeException('The path "' . $path . '" is not valid (not creatable, not writeable?).'); 
    } 
} 

Это сделало это для меня - все остальное происходит при автоматическом сохранении узла.

Я еще не использовал модуль getid3, поэтому я понятия не имею, будет ли он играть вместе с этим способом. Кроме того, мне не нужно было добавлять дополнительную информацию/атрибуты в файловое поле, поэтому, возможно, вам придется добавить в массив полей больше информации, чем только файл, возвращаемый field_file_save_file(). В любом случае, надеюсь, что это поможет и удачи.

+1

+1 для файла field_file_save_file(), который бы меня немного спас. –

+0

Выглядит очень многообещающе, если у меня не было срока, я бы вскочил и сразу же попробовал. – googletorp

1

Я сделал что-то с изображением, которое сработало, я думаю, что структура должна быть права, иначе это не сработает. Это заняло много проб и ошибок. Это то, чем я заполнил поле изображения.

$image['data'] =array(
      'title' => $media_reference_attributes->getNamedItem("source")->value, 
      'description' => $description, 
      'alt' => "",); 
$image['width'] = $width; 
$image['height'] = $height; 
$image['mimetype'] = $mime_type 
$image['uid'] = 1; 
$image['status'] = 1; 
$image['fid'] = $fid; 
$image['filesize'] = $file->filesize; 
$image['nid'] = $id; 
$image['filename'] = $url; 
$image['timestamp'] = $file->timestamp; 
$image['filepath'] = $file_path; 

Надеюсь, это поможет.

1

Возможно, вам стоит взглянуть на Image FUpload, если вам нужно взглянуть на интеграцию загрузки флэш-памяти.

Чтобы перетащить файлы на другой сервер, все еще обрабатывая их через Drupal, немного напоминает пространство CDN, возможно, посмотрите на поведение в проектах или CDN2?

Если вы нашли четкое решение, вернитесь и опубликуйте его!

+0

Изображение FUpload выглядит аналогично.Однако большая разница заключается в том, что я хочу создать узел для каждого файла, поэтому, похоже, я не могу сделать это так, как они это делают. Подойдет ближе, чтобы посмотреть, может ли это быть хоть какой-то помощью. – googletorp

Смежные вопросы