我有这个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'数组为空。因此,出于某种原因,除了将文件附加到节点之外,它做的一切都正确,这就是我几天来一直在喋喋不休。最佳回复获得免费上网?
答案 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