以编程方式将文件上载并保存到Drupal节点

时间:2011-09-13 20:11:05

标签: drupal drupal-7 fileapi

我正在尝试根据自定义表单提交创建节点。除了上传的图像外,一切都很好。

我可以捕获它们并将它们设置在表单对象缓存中。当我将数据传递给函数以创建节点时,我收到此错误:

“无法复制指定的文件,因为不存在该名称的文件。请检查您是否提供了正确的文件名。”

我也多次收到错误,尽管一次只提交一个或两个图像。

这是我正在使用的代码。 $ 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);

第二个导致URI字段中的MySQL出现重复键错误。我在教程中看到过这两个例子,但都没有工作?

3 个答案:

答案 0 :(得分:5)

我使用你的代码将文件字段中的文件上传到内容(在我的情况下是“文档”)并且它已经工作了。只需在代码中为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);
?>

答案 1 :(得分:3)

对于Drupal 7,我玩了很多,发现最好的方式(也是我工作的唯一方法)就是使用Entity metadata wrappers

我使用了托管文件表单元素,如下所示:

  // 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);
  }

答案 2 :(得分:1)

凯文,这就是我在评论中的http://drupal.org/node/201594下的Drupal文档中找到的内容。但我完全不确定。我尝试一样,所以请让我知道你发现了什么。

$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);