Drupal 6节点创建PHP脚本,文件上传不起作用

时间:2011-02-07 18:54:13

标签: php drupal drupal-6 file upload

我有这个PHP脚本我正在努力将付费存根导入Drupal。除了脚本没有将上传的PDF文件附加到节点之外,它按照我想要的方式执行所有操作。

一些笔记; Drupal的文件系统设置为私有,不确定这是否有所不同。其次,pdf文件已经在正确的位置'paystubs / [uid] /paystub_1.pdf'所以我认为我的问题是文件没有正确地与节点相关联。

以下是代码

function create_drupal_node($employeeID, $employeeDate, $drupalUid, $file2) {
  $sourcePDF = "/var/www/html/mgldev.************.com/burst_pdfs/pdfs/" . $file2;
  $destinationPDF = '/paystubs/' . $drupalUid . '/' . $file2;
  $destination = '/paystubs/' . $drupalUid . '/';

  if (!file_check_directory($destination, TRUE)){
    echo "Failed to check dir, does it exist?";
    mkdir($destination);    
    echo "trying to drupal mkdir...";
  }

  // Copy the file to the Drupal files directory 
  if (file_exists($sourcePDF)) {
    if(!rename($sourcePDF, $destinationPDF)) {
        echo "Failed to move file\n";
    } 
  }

  //Create node and attach file uplaod
  $file_drupal_path = "paystubs/" . $drupalUid . "/" . $file2;
  $mime = 'pdf/application';

  $file = new stdClass();
  $file->filename = $file2;
  $file->filepath = $file_drupal_path;
  $file->filemime = $mime;
  $file->filesize = filesize($file_drupal_path);

  $file->uid = $drupalUid;
  $file->status = FILE_STATUS_PERMANENT;
  $file->timestamp = time();
  drupal_write_record('files', $file);

  $node = new StdClass();
  $node->type = 'paystub';
  $node->body = $employeeID;
  $node->title = $employeeDate;
  $node->field_paystub_upload = array(
    array(
      'fid' => $file->fid,
      'title' => $file2,
      'filename' => $file->filename,
      'filepath' => $file->filepath,
      'filesize' => $file->filesize,
      'mimetype' => $mime,
      'data' => array(
        'description' => $file2,
      ),
      'list' => 1,
    ),
  );
  $node->uid = $drupalUid;
  $node->status = 1;
  $node->active = 1;
  $node->promote = 1;
  node_save($node); 
}

创建节点,节点的标题和正文具有正确的值。当我使用Devel模块查看节点时,我可以看到'field_paystub_upload'数组为空。因此,出于某种原因,除了将文件附加到节点之外,它做的一切都正确,这就是我几天来一直在喋喋不休。最佳回复获得免费上网?

2 个答案:

答案 0 :(得分:3)

Drupal的 file.inc file_save_upload使用$_FILES,这是一个global, magically set by PHP。 Drupal需要一个上传的文件,而不是本地存在的文件。

您最好只调用自定义文件保护程序方法来处理本地文件。确保其路径也在files数据库表中。 file_save_upload对于创建这样的辅助方法很有价值。

答案 1 :(得分:1)

非常感谢berkes帮我解决这个问题。事实证明,由于文件已经在drupal网络服务器上而没有上传到PHP $ _FILES全局变量,我无法以编程方式正确上传文件。

这导致了我试图失败的其他方式。我尝试使用Drupals defualt上传模块,我也尝试使用CCK的fielfield模块都无法正常工作。感谢berkes建议我找到了CCK的文件域小部件附带的功能,以保存已经在服务器上的已上载文件。希望这有助于其他人。

This is the function我发现可以保存已经在网络服务器上的文件。

这是我用来创建节点并在调用field_file_save_file之后附加文件的工作代码。

function create_drupal_node($employeeID, $employeeDate, $drupalUid, $file2){
    $file_remove_html_extention = substr($file2, 0, -7);
    $file_pdf = $file_remove_html_extention . '.pdf';

$node = new stdClass();
$node->type = 'paystub';
$node->status = 1;
$node->uid = $drupalUid;
$node->title = $employeeDate . ' - eStub';
$node->body = $employeeID;
$node->created = time();
$node->changed = $node->created;
$node->promote = 1;
$node->sticky = 0;
$node->format = 1;
$node->language = 'en';

$file = '/var/www/html/mgldev.foobar.com/burst_pdfs/pdfs/' . $file_pdf;

// Get the path to your Drupal site's files directory 
$dest_folder = '/paystubs/' . $drupalUid;
$dest = 'paystubs/' . $drupalUid . '/' . $file_pdf;

if (!file_check_directory($dest_folder, TRUE)){
mkdir($dest_folder);    

}

// Load the CCK field $field = content_fields('field_paystub_upload', 'paystub'); // Load the appropriate validators $validators = array_merge(filefield_widget_upload_validators($field)); // Create the file object $file = field_file_save_file($file, $validators, $dest_folder); // Apply the file to the field, this sets the first file only, could be looped // if there were more files $node->field_paystub_upload = array(0 => $file); // The file has been copied in the appropriate directory, so it can be // removed from the import directory unlink($file); // change file status to permanent file_set_status($file,1); node_save($node); } </pre></code>

再次感谢berkes