public function createDownloadPackage($type, $itemIdArray, $parentId, $version) { $app = JFactory::getApplication(); // If set no_counting_download_time, storeId will be used to check if download file in "no counting download" period sort($itemIdArray); $storeId = md5($type . serialize($itemIdArray) . $version); if ($type == 'document') { $params = JUDownloadHelper::getParams($parentId); } else { $params = JUDownloadHelper::getParams(null, $parentId); } $noCountingDownloadSecond = (int) $params->get('no_counting_download_time', 300); if ($noCountingDownloadSecond > 0) { $storeIdArray = (array) $app->getUserState('com_judownload.download.storeid'); } else { $storeIdArray = array(); } $user = JFactory::getUser(); $downloadZippedFileMode = $params->get('download_zipped_file_mode', 'temp'); $downloadOneFileNoZippedMode = $params->get('download_one_file_no_zipped_mode', 'temp'); // Min download speed. $minDownloadSpeed = (int) $params->get('min_download_speed', 10); $minDownloadSpeed = $minDownloadSpeed > 0 ? $minDownloadSpeed : 10; $minDownloadSpeed = $minDownloadSpeed * 1024; //KBps // Min live time of download package. $adjustFileLiveTime = (int) $params->get('adjust_file_live_time', 60); $adjustFileLiveTime = $adjustFileLiveTime >= 0 ? $adjustFileLiveTime : 60; // Time download package created. $createdTimeDate = JFactory::getDate()->toSql(); $createdTimeStamp = strtotime($createdTimeDate); // Trigger JU Download after download $dispatcher = JDispatcher::getInstance(); JPluginHelper::importPlugin('judownload'); // Physical file path to download, to be used in temp folder mode $downloadFilePath = ''; // True if file is zipped by zip class $zipFile = false; // Get comment for zip package. $zipCommentConfig = $params->get('zip_comment', ''); // Zip comment parsed from $zipCommentConfig case by case $zipComment = ''; if ($type == 'document') { // Get category id. $categoryId = $parentId; $documentIdArray = $itemIdArray; // Download multi documents in the same cat if (count($documentIdArray) > 1) { // In this case : user downloading category. // Sort array document id. sort($documentIdArray); // Create zip package. $zip = new Zip(); $zipFile = true; // Parse zip comment $zipComment = $this->parseCommentTxt($zipCommentConfig, $categoryId); // File id array in all download documents to reference in tmp file table $fileIdArrayInTmpZip = array(); foreach ($documentIdArray AS $documentId) { $documentObject = JUDownloadHelper::getDocumentById($documentId); $documentTitle = $this->filterFileFolderName($documentObject->title); $documentTitle = trim($documentTitle); $fileObjectList = $this->getAllFilesOfDocument($documentId); // If document has file, add document title as a folder contains files if (count($fileObjectList)) { $zip->addDirectory($documentTitle); } // File id array in document to log document.download $fileIdArray = array(); $documentSize = 0; foreach ($fileObjectList AS $fileObject) { $physicalFilePath = $this->getPhysicalFilePath($fileObject->id); if (JFile::exists($physicalFilePath)) { $filePathInZip = $documentTitle . '/' . $this->filterFileFolderName($fileObject->rename); // Add file extension to file path, if the extension is not the same original file $fileExtOri = JFile::getExt($physicalFilePath); $fileExtInZip = JFile::getExt($filePathInZip); if ($fileExtInZip != $fileExtOri) { $filePathInZip = $filePathInZip . '.' . $fileExtOri; } $filePathInZip = trim($filePathInZip); $zip->addLargeFile($physicalFilePath, $filePathInZip); $documentSize += $fileObject->size; if (!in_array($storeId, $storeIdArray)) { $this->updateFileDownloadCounter($fileObject->id); } } $fileIdArray[] = $fileObject->id; $fileIdArrayInTmpZip[] = $fileObject->id; } if (!in_array($storeId, $storeIdArray)) { $this->updateDocumentDownloadCounter($documentId); $dispatcher->trigger('onAfterDownloadDocument', array($documentId, $fileIdArray, $documentSize)); // Add log when download $logData = array( 'user_id' => $user->id, 'event' => 'document.download', 'item_id' => $documentId, 'doc_id' => $documentId, 'value' => $documentSize, 'reference' => implode(',', $fileIdArray) ); JUDownloadFrontHelperLog::addLog($logData); } } // End - Zip file $categoryObject = JUDownloadHelper::getCategoryById($categoryId); $zipFileName = $this->makeSafeFileName($categoryObject->title) . ".zip"; } //Download one document else { /* * Download document when not isset cat_id * Download document we only get first element of documentIds array */ $documentId = $documentIdArray[0]; $documentObject = JUDownloadHelper::getDocumentById($documentId); $documentTitle = $this->filterFileFolderName($documentObject->title); $fileObjectList = $this->getAllFilesOfDocument($documentId); // Zip file even document has only one file, we can change this later here... // Create zip download package. $zip = new Zip(); $zipFile = true; // Parse zip comment $zipComment = $this->parseCommentTxt($zipCommentConfig, $categoryId, $documentId); $documentTitle = trim($documentTitle); //Add document title as a folder contains files $zip->addDirectory($documentTitle); $fileIdArray = array(); $documentSize = 0; foreach ($fileObjectList AS $fileObject) { // One document allow to download by version $physicalFilePath = $this->getPhysicalFilePath($fileObject->id, $version); if (JFile::exists($physicalFilePath)) { $filePathInZip = $documentTitle . '/' . $this->filterFileFolderName($fileObject->rename); // Add file extension to file path, if the extension is not the same original file $fileExtOri = JFile::getExt($physicalFilePath); $fileExtInZip = JFile::getExt($filePathInZip); if ($fileExtInZip != $fileExtOri) { $filePathInZip = $filePathInZip . '.' . $fileExtOri; } $filePathInZip = trim($filePathInZip); $zip->addLargeFile($physicalFilePath, $filePathInZip); $documentSize += $fileObject->size; if (!in_array($storeId, $storeIdArray)) { $this->updateFileDownloadCounter($fileObject->id, $version); } } $fileIdArray[] = $fileObject->id; } // End - Zip file if (!in_array($storeId, $storeIdArray)) { $this->updateDocumentDownloadCounter($documentId); $dispatcher->trigger('onAfterDownloadDocument', array($documentId, $fileIdArray, $documentSize)); // Add log $logData = array( 'user_id' => $user->id, 'event' => 'document.download', 'item_id' => $documentId, 'doc_id' => $documentId, 'value' => $documentSize, 'reference' => implode(',', $fileIdArray) . ($version ? ':' . $version : '') ); JUDownloadFrontHelperLog::addLog($logData); } $zipFileName = $this->makeSafeFileName($documentObject->title . " " . $version) . ".zip"; } } elseif ($type == 'file') { $fileIdArray = $itemIdArray; $documentId = $parentId; //Download multi files in one document if (count($fileIdArray) > 1) { $documentObject = JUDownloadHelper::getDocumentById($documentId); $documentTitle = $this->filterFileFolderName($documentObject->title); $mainCategoryId = JUDownloadFrontHelperCategory::getMainCategoryId($documentId); $zip = new Zip(); $zipFile = true; // Parse zip comment $zipComment = $this->parseCommentTxt($zipCommentConfig, $mainCategoryId, $documentId); $documentTitle = trim($documentTitle); $zip->addDirectory($documentTitle); $documentSize = 0; foreach ($fileIdArray AS $fileId) { // One document allow to download by version $physicalFilePath = $this->getPhysicalFilePath($fileId, $version); if (JFile::exists($physicalFilePath)) { $fileObject = $this->getFileObject($fileId); $filePathInZip = $documentTitle . '/' . $this->filterFileFolderName($fileObject->rename); // Add file extension to file path, if the extension is not the same original file $fileExtOri = JFile::getExt($physicalFilePath); $fileExtInZip = JFile::getExt($filePathInZip); if ($fileExtInZip != $fileExtOri) { $filePathInZip = $filePathInZip . '.' . $fileExtOri; } $filePathInZip = trim($filePathInZip); $zip->addLargeFile($physicalFilePath, $filePathInZip); $documentSize += $fileObject->size; if (!in_array($storeId, $storeIdArray)) { $this->updateFileDownloadCounter($fileId, $version); } } } // End - Zip file // Sort $fileIdArrayInTmpZip before add log and store it to tmp files table sort($fileIdArray); if (!in_array($storeId, $storeIdArray)) { $this->updateDocumentDownloadCounter($documentId); $dispatcher->trigger('onAfterDownloadDocument', array($documentId, $fileIdArray, $documentSize)); // Add log $logData = array( 'user_id' => $user->id, 'event' => 'document.download', 'item_id' => $documentId, 'doc_id' => $documentId, 'value' => $documentSize, 'reference' => implode(',', $fileIdArray) . ($version ? ':' . $version : '') ); JUDownloadFrontHelperLog::addLog($logData); } $zipFileName = $this->makeSafeFileName($documentObject->title . " " . $version) . ".zip"; } //Download one file elseif (count($fileIdArray) == 1) { $zipOneFile = $params->get('zip_one_file', 0); $fileId = $itemIdArray[0]; $fileObject = $this->getFileObject($fileId); // One file allow to download by version $physicalFilePath = $this->getPhysicalFilePath($fileId, $version); $physicalFilePath = JPath::clean($physicalFilePath); $fileExtOri = JFile::getExt($physicalFilePath); $configAllowZipFile = $params->get('allow_zip_file', 1); // Download one file no zipped (File can be zip file or not, but we still using var $zipFileName for general download file name) if ($fileExtOri == "zip" || !$zipOneFile || !$configAllowZipFile) { $zipFile = false; // In this case, $zipFileName is file name(zipped or not) $zipFileName = $this->filterFileFolderName($fileObject->rename); $zipFileName = $this->makeSafeFileName(JFile::stripExt($zipFileName) . " " . $version) . "." . JFile::getExt($zipFileName); // Add file extension to file path, if the extension is not the same original file $fileExtInZip = JFile::getExt($zipFileName); if ($fileExtInZip != $fileExtOri) { $zipFileName = $zipFileName . '.' . $fileExtOri; } $zipFileName = trim($zipFileName); } // Download one file zipped else { // Initialize zip object. $zip = new Zip(); $zipFile = true; $mainCategoryId = JUDownloadFrontHelperCategory::getMainCategoryId($documentId); // Parse zip comment $zipComment = $this->parseCommentTxt($zipCommentConfig, $mainCategoryId, $documentId); if (JFile::exists($physicalFilePath)) { $filePathInZip = $this->filterFileFolderName($fileObject->rename); // Add file extension to file path, if the extension is not the same original file $fileExtInZip = JFile::getExt($filePathInZip); if ($fileExtInZip != $fileExtOri) { $filePathInZip = $filePathInZip . '.' . $fileExtOri; } $filePathInZip = trim($filePathInZip); $zip->addLargeFile($physicalFilePath, $filePathInZip); } // End - Zip file $zipFileName = $this->filterFileFolderName($fileObject->rename); $zipFileName = $this->makeSafeFileName(JFile::stripExt($zipFileName) . " " . $version) . ".zip"; $zipFileName = trim($zipFileName); } if (!in_array($storeId, $storeIdArray)) { $this->updateDocumentDownloadCounter($documentId, $version); $this->updateFileDownloadCounter($fileId, $version); $dispatcher->trigger('onAfterDownloadDocument', array($documentId, $fileIdArray, $fileObject->size)); // Add log $logData = array( 'user_id' => $user->id, 'event' => 'document.download', 'item_id' => $documentId, 'doc_id' => $documentId, 'value' => $fileObject->size, 'reference' => $fileId . ($version ? ':' . $version : '') ); JUDownloadFrontHelperLog::addLog($logData); } } } // Only support download file/document, invalid type -> return false else { return false; } $serverTime = JFactory::getDate()->toSql(); $serverTimeStamp = strtotime($serverTime); // Store ID of download file(s) into session if ($noCountingDownloadSecond > 0) { $storeIdArray = (array) $app->getUserState('com_judownload.download.storeid'); $storeIdArray[$serverTimeStamp] = $storeId; $storeIdArray = array_unique($storeIdArray); $app->setUserState('com_judownload.download.storeid', $storeIdArray); } // Last download time to calculate download interval $session = JFactory::getSession(); $session->set('judl-last-download-time', $serverTime); // If use zip class to zip files, set comment then close the archive if ($zipFile) { // Set comment for zip file $zip->setComment($zipComment); // Close the archive $zip->finalize(); } // Send email by event for each document when download $docIdArray = array(); if ($type == 'file') { $docIdArray[] = $parentId; } else { $docIdArray = $itemIdArray; } $docIdArray = array_unique($docIdArray); //Send mail by event foreach ($docIdArray AS $docId) { JUDownloadFrontHelperMail::sendEmailByEvent('document.download', $docId); } // Download ZIPPED file if ($zipFile) { // Directly download(from zip resource by PHP) $resourceFilePath = $zip->getZipFile(); $transport = 'php'; $speed = (int) $params->get('max_download_speed', 200); $resume = $params->get('resume_download', 1); $downloadMultiParts = $params->get('download_multi_parts', 1); $downloadResult = JUDownloadHelper::downloadFile($resourceFilePath, $zipFileName, $transport, $speed, $resume, $downloadMultiParts); if ($downloadResult !== true) { $this->setError($downloadResult); return false; } } // Download ONE NO ZIPPED file, in this case $zipFileName is the download file name, file can be zip file or not else { // Directly download $transport = $downloadOneFileNoZippedMode; $speed = (int) $params->get('max_download_speed', 200); $resume = $params->get('resume_download', 1); $downloadMultiParts = $params->get('download_multi_parts', 1); $downloadResult = JUDownloadHelper::downloadFile($physicalFilePath, $zipFileName, $transport, $speed, $resume, $downloadMultiParts); if ($downloadResult !== true) { $this->setError($downloadResult); return false; } } return true; }
function export_and_download_layouts() { if (isset($_POST['export_and_download'])) { $nonce = $_POST["wp_nonce_export_layouts"]; if (WPDD_Utils::user_not_admin()) { die(__("You don't have permission to perform this action!", 'ddl-layouts')); } if (wp_verify_nonce($nonce, 'wp_nonce_export_layouts')) { $results = $this->export_for_download(); $sitename = sanitize_key(get_bloginfo('name')); if (!empty($sitename)) { $sitename .= '.'; } require_once WPDDL_TOOLSET_COMMON_ABSPATH . '/Zip.php'; if (class_exists('Zip')) { $dirname = $sitename . 'dd-layouts.' . date('Y-m-d'); $zipName = $dirname . '.zip'; $zip = new Zip(); $zip->addDirectory($dirname); foreach ($results as $file_data) { $zip->addFile($file_data['file_data'], $dirname . '/' . $file_data['file_name']); } $zip->sendZip($zipName); } } die; } }
function download_project() { define('WP_MEMORY_LIMIT', '1024M'); ini_set('memory_limit', '1024M'); global $wpdb, $current_user; if (!is_user_logged_in()) { exit; } $pid = $_GET['id']; $zip = new Zip(); $folders = $wpdb->get_results($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . "sp_cu_project where id = %d", $pid), ARRAY_A); $zip_dir = "" . SP_CDM_UPLOADS_DIR . "" . AUTH_KEY . "/"; $zip_path = '' . SP_CDM_UPLOADS_DIR_URL . '' . AUTH_KEY . '/'; if (!is_dir($zip_dir)) { mkdir($zip_dir, 0777); } $return_file = "" . preg_replace('/[^\\w\\d_ -]/si', '', sanitize_title($folders[0]['name'])) . "-" . time() . ".zip"; #echo "SELECT * FROM " . $wpdb->prefix . "sp_cu_project where id IN(".$folders_id.") order by name "; #print_r($folders); for ($j = 0; $j < count($folders); $j++) { $zip->addDirectory($this->folder_name($folders[$j]['id'])); $r = $this->folder_files($folders[$j]['id']); for ($i = 0; $i < count($r); $i++) { $dir = '' . SP_CDM_UPLOADS_DIR . '' . $r[$i]['uid'] . '/'; $zip->addFile($this->get_file($dir . $r[$i]['file']), $this->folder_name($folders[$j]['id']) . '/' . $r[$i]['file'], filectime($dir . $r[$i]['file'])); unset($dir); } $this->sub_folders($folders[$j]['id'], $this->folder_name($folders[$j]['id']), $zip); } $zip->finalize(); // as we are not using getZipData or getZipFile, we need to call finalize ourselves. $zip->setZipFile($zip_dir . $return_file); header("Location: " . $zip_path . $return_file . ""); }