Загрузка и сохранение файла программно на узлы Drupal - PullRequest
4 голосов
/ 14 сентября 2011

Я пытаюсь создать узел на основе отправки пользовательской формы.Все отлично работает, за исключением загружаемых изображений.

Я могу их прекрасно захватить и установить в кеше объектов формы.Когда я передаю данные в функцию для создания узла, я получаю эту ошибку:

"Указанный файл не может быть скопирован, поскольку файл с таким именем не существует. Убедитесь, что вы указали правильное имя файла.«

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

Вот код, который я использую.$ uploads передается и является массивом файловых объектов, возвращенных из file_save_upload () на предыдущем шаге:

if (isset($uploads)) {
    foreach ($uploads as $upload) {
      if (isset($upload)) {
        $file = new stdClass;
        $file->uid = 1;
        $file->uri = $upload->filepath;
        $file->filemime = file_get_mimetype($upload->uri);
        $file->status = 1;  

        $file = file_copy($file, 'public://images');

        $node->field_image[$node->language][] = (array) $file;
      }
    }
  }

  node_save($node);

Я также пробовал это:

if (isset($uploads)) {
    foreach ($uploads as $upload) {
        $upload->status = 1;  

        file_save($upload);

        $node->field_image[$node->language][] = (array) $upload;
      }
    }
  }

  node_save($node);

Второй вызывает дубликатключевая ошибка в MySQL на поле URI.Оба эти примера я видел в уроках, но ни один из них не работает?

Ответы [ 3 ]

5 голосов
/ 01 июня 2012

Я использовал ваш код для загрузки файла в поле файла в контент (в моем случае это «документ»), и это сработало.Просто нужно было добавить значение для field_document_file 'display' в коде.Вот точный сценарий, который я использовал:

<?php
// Bootstrap Drupal
define('DRUPAL_ROOT', getcwd());
require_once './includes/bootstrap.inc';
require_once './includes/file.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

// Construct the new node object.
$path = 'Documents/document1.doc';
$filetitle = 'test';
$filename = 'document1.doc';

$node = new StdClass();

$file_temp = file_get_contents($path);

//Saves a file to the specified destination and creates a database entry.
$file_temp = file_save_data($file_temp, 'public://' . $filename, FILE_EXISTS_RENAME);

$node->title = $filetitle;
$node->body[LANGUAGE_NONE][0]['value'] = "The body of test upload document.\n\nAdditional Information";
$node->uid = 1;
$node->status = 1;
$node->type = 'document';
$node->language = 'und';
$node->field_document_files = array(
'und' => array(
    0 => array(
        'fid' => $file_temp->fid,
        'filename' => $file_temp->filename,
        'filemime' => $file_temp->filemime,
        'uid' => 1,
        'uri' => $file_temp->uri,
        'status' => 1,
        'display' => 1
    )
)
);
$node->field_taxonomy = array('und' => array(
0 => array(
    'tid' => 76
)
));
node_save($node);
?>
3 голосов
/ 23 октября 2014

В Drupal 7 я немного поиграл с этим и нашел лучший способ (и единственный способ, с которым я работал) - это использовать Обертки метаданных сущностей

Iиспользовал элемент формы управляемого файла следующим образом:

  // Add file upload widget
  // Use the #managed_file FAPI element to upload a document.
  $form['response_document'] = array(
    '#title' => t('Attach a response document'),
    '#type' => 'managed_file',
    '#description' => t('Please use the Choose file button to attach a response document<br><strong>Allowed extensions: pdf doc docx</strong>.'),
    '#upload_validators' => array('file_validate_extensions' => array('pdf doc docx')),
    '#upload_location' => 'public://my_destination/response_documents/',
  );

Я также передаю объект $ node в моей форме как значение

$form['node'] = array('#type' => 'value', '#value' => $node);

Затем в моем обработчике отправки я просто выполняюследующее:

  $values = $form_state['values'];
  $node = $values['node'];
  // Load the file and save it as a permanent file, attach it to our $node.
  $file = file_load($values['response_document']);
  if ($file) {
    $file->status = FILE_STATUS_PERMANENT;
    file_save($file);

    // Attach the file to the node.
    $wrapper = entity_metadata_wrapper('node', $node);
    $wrapper->field_response_files[] = array(
      'fid' => $file->fid,
      'display' => TRUE,
      'description' => $file->filename,
    );
    node_save($node);
  }
1 голос
/ 04 октября 2011

Кевин, это то, что я нашел в документации Drupal под http://drupal.org/node/201594 ниже в комментариях.Но я совсем не уверен.Я пробую то же самое, поэтому, пожалуйста, дайте мне знать, что вы узнали.

$path = './sites/default/files/test.jpg';
$filetitle = 'test';
$filename = 'test.jpg';

$node = new StdClass();

$file_temp = file_get_contents($path);
$file_temp = file_save_data($file_temp, 'public://' . $filename, FILE_EXISTS_RENAME);

$node->title = $filetitle;
$node->uid = 1;
$node->status = 1;
$node->type = '[content_type]';
$node->language = 'und';
$node->field_images = array(
'und' => array(
    0 => array(
        'fid' => $file_temp->fid,
        'filename' => $file_temp->filename,
        'filemime' => $file_temp->filemime,
        'uid' => 1,
        'uri' => $file_temp->uri,
        'status' => 1
    )
)
);
$node->field_taxonomy = array('und' => array(
0 => array(
    'tid' => 76
)
));
node_save($node);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...