/** * PRIVATE routine to upload the file, add it to the database, convert into proof formats and ingest in repository. * @param $fileName string index into the $_FILES array * @param $type string identifying type * @param $fileId int ID of an existing file to update * @param $overwrite boolean overwrite all previous revisions of the file (revision number is still incremented) * @return int the file ID (false if upload failed) */ function handleUpload($fileName, $type, $fileId = null, $overwrite = false) { if (HookRegistry::call('ArticleFileManager::handleUpload', array(&$fileName, &$type, &$fileId, &$overwrite, &$result))) { return $result; } $articleDao =& DAORegistry::getDAO('ArticleDAO'); $articleFileDao =& DAORegistry::getDAO('ArticleFileDAO'); $typePath = $this->typeToPath($type); $dir = $this->filesDir . $typePath . '/'; //%CBP% get the most recent supplementary files - this is used later for upating supplmentary file datastreams $CBPPlatformDao =& DAORegistry::getDAO('CBPPlatformDAO'); $mostRecentSupplementaryFiles = $CBPPlatformDao->getMostRecentSupplementaryFiles($this->articleId, $fileId); if (!$fileId) { // Insert dummy file to generate file id FIXME? $dummyFile = true; $articleFile =& $this->generateDummyFile($this->article); } else { $dummyFile = false; $articleFile = new ArticleFile(); $articleFile->setRevision($articleFileDao->getRevisionNumber($fileId) + 1); $articleFile->setArticleId($this->articleId); $articleFile->setFileId($fileId); $articleFile->setDateUploaded(Core::getCurrentDate()); $articleFile->setDateModified(Core::getCurrentDate()); } $article = $articleDao->getArticle($articleFile->getArticleId()); $articleFile->setFileType($_FILES[$fileName]['type']); $articleFile->setFileSize($_FILES[$fileName]['size']); $articleFile->setOriginalFileName(ArticleFileManager::truncateFileName($_FILES[$fileName]['name'], 127)); $articleFile->setType($typePath); $articleFile->setRound($this->article->getCurrentRound()); $newFileName = $this->generateFilename($articleFile, $type, $this->getUploadedFileName($fileName)); if (!$this->uploadFile($fileName, $dir . $newFileName)) { // Delete the dummy file we inserted $articleFileDao->deleteArticleFileById($articleFile->getFileId()); return false; } if ($dummyFile) { $articleFileDao->updateArticleFile($articleFile); } else { $articleFileDao->insertArticleFile($articleFile); } if ($overwrite) { $this->removePriorRevisions($articleFile->getFileId(), $articleFile->getRevision()); } //%CBP% Upload file to Repository and update database with PID/DsId $epubconvert = new CBPPlatformEpubConvert(); $mobiconvert = new CBPPlatformMobiConvert(); $pdfconvert = new CBPPlatformPdfConvert(); if ($type == "SP") { //if we're uploading a supplementary file if ($fileId) { $dsSuffix = str_replace("content", "", $mostRecentSupplementaryFiles[0]['fedora_dsid']); } else { $mostRecentSupplementaryFiles = $CBPPlatformDao->getMostRecentSupplementaryFiles($this->articleId); } if (count($mostRecentSupplementaryFiles) == 1 && !$fileId) { $dsSuffix = "05"; } elseif (count($mostRecentSupplementaryFiles) > 1 && !$fileId) { $mostRecentSupplementaryFiles = $CBPPlatformDao->getMostRecentSupplementaryFiles($this->articleId); $dsId = str_replace("content", "", $mostRecentSupplementaryFiles[1]['fedora_dsid']); $dsId = (int) $dsId; $dsId++; $dsSuffix = sprintf("%02d", $dsId); } } if (mime_content_type($dir . $newFileName) == "application/zip" && $type != "SP") { $ebookFileName = str_replace($this->parseFileExtension($newFileName), "", $newFileName); $epubArgs = array("author" => $this->article->getAuthorString(), "title" => $this->article->getArticleTitle(), "description" => $this->article->getArticleAbstract()); $epubconvert->createEpub($dir, $newFileName, $dir . $ebookFileName . "epub", null, $this->article->getJournalId(), $epubArgs); $mobiconvert->createMobi($dir, $newFileName, $dir . $ebookFileName . "mobi", null, $this->article->getJournalId(), $epubArgs); $pdfconvert->createPdf($dir, $newFileName, $dir . $ebookFileName . "pdf", null, $this->article->getJournalId(), $epubArgs); $digitalObject = new CBPPlatformDigitalObject(); $digitalObject->setPID($this->articleId); //we use articleId as the unique identifier -- this should correspond with articleId in OJS database $digitalObject->setLabel($article->getArticleTitle()); //label could be anything $digitalObject->setNamespace(Config::getVar('general', 'component_namespace')); $digitalObject->setPrimaryFormat("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); $ext = $this->parseFileExtension($newFileName); $label = str_replace(".{$ext}", "", $newFileName); $ext = "docx"; $digitalObject->setDatastream(array($dsId = $dsPrefix . "content" => array("id" => $dsPrefix . "content", "file" => "{$dir}{$newFileName}", "label" => $label . ".{$ext}", "mimetype" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "filetype" => $ext))); // $ext = "pdf"; $digitalObject->setDatastream(array($dsPrefix . "content02" => array("id" => $dsPrefix . "content02", "file" => "{$dir}{$ebookFileName}" . "{$ext}", "label" => $label . ".{$ext}", "mimetype" => "application/pdf", "filetype" => $ext))); // $ext = "epub"; $digitalObject->setDatastream(array($dsPrefix . "content03" => array("id" => $dsPrefix . "content03", "file" => "{$dir}{$ebookFileName}" . "{$ext}", "label" => $label . ".{$ext}", "mimetype" => "application/epub+zip", "filetype" => $ext))); /// $ext = "mobi"; $digitalObject->setDatastream(array($dsPrefix . "content04" => array("id" => $dsPrefix . "content04", "file" => "{$dir}{$ebookFileName}" . "{$ext}", "label" => $label . ".{$ext}", "mimetype" => "application/x-mobipocket-ebook", "filetype" => $ext))); } else { $digitalObject = new CBPPlatformDigitalObject(); $digitalObject->setPID($this->articleId); //we use articleId as the unique identifier -- this should correspond with articleId in OJS database $digitalObject->setLabel($article->getArticleTitle()); //label could be anything $digitalObject->setNamespace(Config::getVar('general', 'component_namespace')); if ($type != "SP") { $digitalObject->setPrimaryFormat(mime_content_type($dir . $newFileName)); } $label = $newFileName; $path_parts = pathinfo("{$dir}{$newFileName}"); $digitalObject->setDatastream(array($dsId = $dsPrefix . "content" . $dsSuffix => array("id" => $dsPrefix . "content" . $dsSuffix, "file" => "{$dir}{$newFileName}", "label" => $label, "mimetype" => $this->returnMIMEType($dir . $newFileName), "filetype" => $path_parts['extension']))); } $obj = new SimpleXMLElement($digitalObject->readObjectProperties()); foreach ($obj as $result) { $noObjects = $result->count(); } if ($noObjects == 0) { $digitalObject->createObject(); } $digitalObject->createObjectDatastreams(); if ($type != "SP") { $digitalObject->makeHydraCompliant(null, $article->getArticleTitle(), $article->getAuthorString()); } if ($digitalObject->obj->PID != "" && $dsId != "") { $CBPPlatformDao->setFedoraObjectInformation($digitalObject->obj->PID, $digitalObject->obj->ns, $dsId, $articleFile->getFileId(), $articleFile->getRevision()); } return $articleFile->getFileId(); }