Commit 6c19b2e96ab5787c3a60717dbdfdbbb8ec856eed

Authored by nbm
1 parent 3df04ed1

Add Bulk Export Plugin, which creates a ZIP file of the folder and all

its contents.


git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/trunk@4915 c91229c3-7414-0410-bfa2-8a42b809f60b
plugins/ktstandard/KTBulkExportPlugin.php 0 → 100644
  1 +<?php
  2 +
  3 +require_once(KT_LIB_DIR . '/plugins/plugin.inc.php');
  4 +require_once(KT_LIB_DIR . '/plugins/pluginregistry.inc.php');
  5 +
  6 +class KTBulkExportPlugin extends KTPlugin {
  7 + var $sNamespace = "ktstandard.bulkexport.plugin";
  8 +
  9 + function setup() {
  10 + $this->registerAction('folderaction', 'KTBulkExportAction', 'ktstandard.bulkexport.action');
  11 + }
  12 +}
  13 +
  14 +require_once(KT_LIB_DIR . '/actions/folderaction.inc.php');
  15 +
  16 +class KTBulkExportAction extends KTFolderAction {
  17 + var $sDisplayName = 'Bulk Export';
  18 + var $sName = 'ktstandard.bulkexport.action';
  19 + var $sPermissionName = "ktcore.permissions.read";
  20 +
  21 + function do_main() {
  22 + $this->oPage->template = "kt3/minimal_page";
  23 + $this->handleOutput("");
  24 +
  25 + $oStorage =& KTStorageManagerUtil::getSingleton();
  26 + $aQuery = $this->buildQuery();
  27 + $this->oValidator->notError($aQuery);
  28 + $aDocumentIds = DBUtil::getResultArrayKey($aQuery, 'id');
  29 + $sTmpPath = tempnam('/tmp', 'kt_export');
  30 + unlink($sTmpPath);
  31 + mkdir($sTmpPath, 0700);
  32 + $this->sTmpPath = $sTmpPath;
  33 + $aPaths = array();
  34 + foreach ($aDocumentIds as $iId) {
  35 + $oDocument = Document::get($iId);
  36 + $sParentFolder = sprintf('%s/%s', $sTmpPath, $oDocument->getFullPath());
  37 + $newDir = $this->sTmpPath;
  38 + foreach (split('/', $oDocument->getFullPath()) as $dirPart) {
  39 + $newDir = sprintf("%s/%s", $newDir, $dirPart);
  40 + if (!file_exists($newDir)) {
  41 + mkdir($newDir, 0700);
  42 + }
  43 + }
  44 + $sOrigFile = $oStorage->temporaryFile($oDocument);
  45 + $sFilename = sprintf("%s/%s", $sParentFolder, $oDocument->getFileName());
  46 + copy($sOrigFile, $sFilename);
  47 + $aPaths[] = sprintf("%s/%s", $oDocument->getFullPath(), $oDocument->getFileName());
  48 + }
  49 + $sManifest = sprintf("%s/%s", $this->sTmpPath, "MANIFEST");
  50 + file_put_contents($sManifest, join("\n", $aPaths));
  51 + $sZipFile = sprintf("%s/%s.zip", $this->sTmpPath, $this->oFolder->getName());
  52 + $_SESSION['bulkexport'] = KTUtil::arrayGet($_SESSION, 'bulkexport', array());
  53 + $sExportCode = KTUtil::randomString();
  54 + $_SESSION['bulkexport'][$sExportCode] = array(
  55 + 'file' => $sZipFile,
  56 + 'dir' => $this->sTmpPath,
  57 + );
  58 + $sZipCommand = KTUtil::findCommand("import/zip", "zip");
  59 + $aCmd = array(
  60 + $sZipCommand,
  61 + "-r",
  62 + $sZipFile,
  63 + ".",
  64 + "-i@MANIFEST",
  65 + );
  66 + $sOldPath = getcwd();
  67 + chdir($this->sTmpPath);
  68 + $aOptions = array('popen' => 'r');
  69 + $fh = KTUtil::pexec($aCmd, $aOptions);
  70 + $last_beat = time();
  71 + while(!feof($fh)) {
  72 + if ($i % 1000 == 0) {
  73 + $this_beat = time();
  74 + if ($last_beat + 1 < $this_beat) {
  75 + $last_beat = $this_beat;
  76 + print "&nbsp;";
  77 + }
  78 + }
  79 + $contents = fread($fh, 4096);
  80 + if ($contents) {
  81 + print nl2br($contents);
  82 + }
  83 + $i++;
  84 + }
  85 + pclose($fh);
  86 +
  87 + $url = KTUtil::addQueryStringSelf(sprintf('action=downloadZipFile&fFolderId=%d&exportcode=%s', $this->oFolder->getId(), $sExportCode));
  88 + printf('Go <a href="%s">here</a> to download the zip file if you are not automatically redirected there', $url);
  89 + printf('<script language="JavaScript">document.location.href = "%s";</script>', $url);
  90 + printf("</div></div>\n");
  91 + exit(0);
  92 + }
  93 +
  94 + function buildQuery() {
  95 + $oUser = User::get($_SESSION['userID']);
  96 + $res = KTSearchUtil::permissionToSQL($oUser, $this->sPermissionName);
  97 + if (PEAR::isError($res)) {
  98 + return $res;
  99 + }
  100 + list($sPermissionString, $aPermissionParams, $sPermissionJoin) = $res;
  101 + $aPotentialWhere = array($sPermissionString, 'D.parent_folder_ids = ? OR D.parent_folder_ids LIKE ?', 'D.status_id = 1');
  102 + $aWhere = array();
  103 + foreach ($aPotentialWhere as $sWhere) {
  104 + if (empty($sWhere)) {
  105 + continue;
  106 + }
  107 + if ($sWhere == "()") {
  108 + continue;
  109 + }
  110 + $aWhere[] = $sWhere;
  111 + }
  112 + $sWhere = "";
  113 + if ($aWhere) {
  114 + $sWhere = "\tWHERE " . join(" AND ", $aWhere);
  115 + }
  116 +
  117 + $sSelect = KTUtil::arrayGet($aOptions, 'select', 'D.id');
  118 +
  119 + $sQuery = sprintf("SELECT %s FROM %s AS D
  120 + LEFT JOIN %s AS DM ON D.metadata_version_id = DM.id
  121 + LEFT JOIN %s AS DC ON DM.content_version_id = DC.id
  122 + %s %s",
  123 + $sSelect, KTUtil::getTableName("documents"),
  124 + KTUtil::getTableName("document_metadata_version"),
  125 + KTUtil::getTableName("document_content_version"),
  126 + $sPermissionJoin, $sWhere);
  127 + $aParams = array();
  128 + $aParams = array_merge($aParams, $aPermissionParams);
  129 + $aParentFolderIds = split(',', $this->oFolder->getParentFolderIds());
  130 + $aParentFolderIds[] = $this->oFolder->getId();
  131 + if ($aParentFolderIds[0] == 0) {
  132 + array_shift($aParentFolderIds);
  133 + }
  134 + $sParentFolderIds = join(',', $aParentFolderIds);
  135 + $aParams[] = $sParentFolderIds;
  136 + $aParams[] = $sParentFolderIds . ",%";
  137 + return array($sQuery, $aParams);
  138 + }
  139 +
  140 + function do_downloadZipFile() {
  141 + $sCode = $this->oValidator->validateString($_REQUEST['exportcode']);
  142 + $aData = KTUtil::arrayGet($_SESSION['bulkexport'], $sCode);
  143 + $this->oValidator->notEmpty($aData);
  144 + $sZipFile = $aData['file'];
  145 + header("Content-Type: application/zip");
  146 + header("Content-Length: ". filesize($sZipFile));
  147 + header("Content-Disposition: attachment; filename=\"" . $this->oFolder->getName() . ".zip" . "\"");
  148 + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  149 + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
  150 + header("Cache-Control: must-revalidate");
  151 + readfile($sZipFile);
  152 + $sTmpDir = $aData['dir'];
  153 + KTUtil::deleteDirectory($sTmpDir);
  154 + exit(0);
  155 + }
  156 +}
  157 +$oPluginRegistry =& KTPluginRegistry::getSingleton();
  158 +$oPluginRegistry->registerPlugin('KTBulkExportPlugin', 'ktstandard.bulkexport.plugin', __FILE__);
  159 +
  160 +?>
... ...