public static function export($idstr) { $idArr = is_array($idstr) ? $idstr : explode(",", $idstr); if (1 < count($idArr)) { $zip = new Zip(); $exportFileName = Ibos::lang("Form export file pack", "workflow.default", array("{date}" => date("Y-m-d"))); $zipFileName = FileUtil::getTempPath() . "/" . TIMESTAMP . ".zip"; foreach ($idArr as $id) { $form = self::handleExportSingleForm($id); $zip->addFile($form["content"], sprintf("%s.html", ConvertUtil::iIconv($form["title"], CHARSET, "gbk"))); } $fp = fopen($zipFileName, "w"); if (@fwrite($fp, $zip->file()) !== false) { header("Cache-control: private"); header("Content-type: application/octet-stream"); header("Accept-Ranges: bytes"); header("Content-Length: " . sprintf("%u", FileUtil::fileSize($zipFileName))); header("Content-Disposition: attachment; filename=" . $exportFileName . ".zip"); readfile($zipFileName); exit; } } else { $id = implode(",", $idArr); $form = self::handleExportSingleForm($id); ob_end_clean(); header("Cache-control: private"); header("Content-type: text/plain"); header("Accept-Ranges: bytes"); header("Accept-Length: " . strlen($form["content"])); header("Content-Disposition: attachment; filename=" . $form["title"] . ".html"); echo $form["content"]; } }
public static function databaseBackup() { $config = Ibos::app()->setting->toArray(); $command = Ibos::app()->db->createCommand("SET SQL_QUOTE_SHOW_CREATE=0"); $command->execute(); $fileName = EnvUtil::getRequest("filename"); $hasDangerFileName = preg_match("/(\\.)(exe|jsp|asp|aspx|cgi|fcgi|pl)(\\.|\$)/i", $fileName); if (!$fileName || (bool) $hasDangerFileName) { return array("type" => "error", "msg" => Ibos::lang("Database export filename invalid", "dashboard.default")); } $tablePrefix = $config["config"]["db"]["tableprefix"]; $dbCharset = $config["config"]["db"]["charset"]; $type = EnvUtil::getRequest("backuptype"); if ($type == "all") { $tableList = self::getTablelist($tablePrefix); $tables = self::arrayKeysTo($tableList, "Name"); } elseif ($type == "custom") { $tables = array(); if (is_null(EnvUtil::getRequest("dbSubmit"))) { $tables = Setting::model()->fetchSettingValueByKey("custombackup"); $tables = unserialize($tables); } else { $customTables = EnvUtil::getRequest("customtables"); Setting::model()->updateSettingValueByKey("custombackup", is_null($customTables) ? "" : $customTables); $tables =& $customTables; } if (!is_array($tables) || empty($tables)) { return array("type" => "error", "msg" => Ibos::lang("Database export custom invalid", "dashboard.default")); } } $time = date("Y-m-d H:i:s", TIMESTAMP); $volume = intval(EnvUtil::getRequest("volume")) + 1; $method = EnvUtil::getRequest("method"); $encode = base64_encode("{$config["timestamp"]}," . VERSION . ",{$type},{$method},{$volume},{$tablePrefix},{$dbCharset}"); $idString = "# Identify: " . $encode . "\n"; $sqlCharset = EnvUtil::getRequest("sqlcharset"); $sqlCompat = EnvUtil::getRequest("sqlcompat"); $dbVersion = Ibos::app()->db->getServerVersion(); $useZip = EnvUtil::getRequest("usezip"); $useHex = EnvUtil::getRequest("usehex"); $extendIns = EnvUtil::getRequest("extendins"); $sizeLimit = EnvUtil::getRequest("sizelimit"); $dumpCharset = !empty($sqlCharset) ? $sqlCharset : str_replace("-", "", CHARSET); $isNewSqlVersion = "4.1" < $dbVersion && (!is_null($sqlCompat) || $sqlCompat == "MYSQL41"); $setNames = !empty($sqlCharset) && $isNewSqlVersion ? "SET NAMES '{$dumpCharset}';\n\n" : ""; if ("4.1" < $dbVersion) { if ($sqlCharset) { $command->setText("SET NAMES `{$sqlCharset}`")->execute(); } if ($sqlCompat == "MYSQL40") { $command->setText("SET SQL_MODE='MYSQL40'")->execute(); } elseif ($sqlCompat == "MYSQL41") { $command->setText("SET SQL_MODE=''")->execute(); } } if (!is_dir(self::BACKUP_DIR)) { FileUtil::makeDir(self::BACKUP_DIR, 511); } $backupFileName = self::BACKUP_DIR . "/" . str_replace(array("/", "\\", ".", "'"), "", $fileName); if ($method == "multivol") { $sqlDump = ""; $tableId = intval(EnvUtil::getRequest("tableid")); $startFrom = intval(EnvUtil::getRequest("startfrom")); if (!$tableId && $volume == 1) { foreach ($tables as $table) { $sqlDump .= self::getSqlDumpTableStruct($table, $sqlCompat, $sqlCharset, $dumpCharset); } } for (self::$complete = true; strlen($sqlDump) + 500 < $sizeLimit * 1000; $tableId++) { $sqlDump .= self::sqlDumpTable($tables[$tableId], $extendIns, $sizeLimit, $useHex, $startFrom, strlen($sqlDump)); if (self::$complete) { $startFrom = 0; } } $dumpFile = $backupFileName . "-%s.sql"; !self::$complete && $tableId--; if (trim($sqlDump)) { $sqlDump = "{$idString}# <?php exit();?>\n# IBOS Multi-Volume Data Dump Vol.{$volume}\n# Version: IBOS {$config["version"]}\n# Time: {$time}\n# Type: {$type}\n# Table Prefix: {$tablePrefix}\n#\n# IBOS Home: http://www.ibos.com.cn\n# Please visit our website for newest infomation about IBOS\n# --------------------------------------------------------\n\n\n{$setNames}" . $sqlDump; $dumpFileName = sprintf($dumpFile, $volume); @($fp = fopen($dumpFileName, "wb")); @flock($fp, 2); if (@(!fwrite($fp, $sqlDump))) { @fclose($fp); return array("type" => "error", "msg" => Ibos::lang("Database export file invalid", "dashboard.default"), "url" => ""); } else { fclose($fp); if ($useZip == 2) { $fp = fopen($dumpFileName, "r"); $content = @fread($fp, filesize($dumpFileName)); fclose($fp); $zip = new Zip(); $zip->addFile($content, basename($dumpFileName)); $fp = fopen(sprintf($backupFileName . "-%s.zip", $volume), "w"); if (@fwrite($fp, $zip->file()) !== false) { @unlink($dumpFileName); } fclose($fp); } unset($sqlDump); unset($zip); unset($content); $param = array("setup" => 1, "backuptype" => rawurlencode($type), "filename" => rawurlencode($fileName), "method" => "multivol", "sizelimit" => rawurlencode($sizeLimit), "volume" => rawurlencode($volume), "tableid" => rawurlencode($tableId), "startfrom" => rawurlencode(self::$startRow), "extendins" => rawurlencode($fileName), "sqlcharset" => rawurlencode($sqlCharset), "sqlcompat" => rawurlencode($sqlCompat), "usehex" => $useHex, "usezip" => $useZip); $url = Ibos::app()->urlManager->createUrl("dashboard/database/backup", $param); return array("type" => "success", "msg" => Ibos::lang("Database export multivol redirect", "dashboard.default", array("volume" => $volume)), "url" => $url); } } else { $volume--; if ($useZip == 1) { $zip = new Zip(); $zipFileName = $backupFileName . ".zip"; $unlinks = array(); for ($i = 1; $i <= $volume; $i++) { $filename = sprintf($dumpFile, $i); $fp = fopen($filename, "r"); $content = @fread($fp, filesize($filename)); fclose($fp); $zip->addFile($content, basename($filename)); $unlinks[] = $filename; } $fp = fopen($zipFileName, "w"); if (@fwrite($fp, $zip->file()) !== false) { foreach ($unlinks as $link) { @unlink($link); } } else { return array("type" => "success", "msg" => Ibos::lang("Database export multivol succeed", "dashboard.default", array("volume" => $volume)), "url" => Ibos::app()->urlManager->createUrl("dashboard/database/restore")); } unset($sqlDump); unset($zip); unset($content); fclose($fp); $filename = $zipFileName; return array("type" => "success", "msg" => Ibos::lang("Database export zip succeed", "dashboard.default"), "param" => array("autoJump" => false)); } else { return array("type" => "success", "msg" => Ibos::lang("Database export multivol succeed", "dashboard.default", array("volume" => $volume)), "url" => Ibos::app()->urlManager->createUrl("dashboard/database/restore")); } } } else { $tablesstr = ""; foreach ($tables as $table) { $tablesstr .= "\"" . $table . "\" "; } $db = $config["config"]["db"]; $query = $command->setText("SHOW VARIABLES LIKE 'basedir'")->queryRow(); $mysqlBase = $query["Value"]; $dumpFile = addslashes(dirname(dirname(__FILE__))) . "/" . $backupFileName . ".sql"; @unlink($dumpFile); $mysqlBin = $mysqlBase == "/" ? "" : addslashes($mysqlBase) . "bin/"; shell_exec($mysqlBin . "mysqldump --force --quick " . ("4.1" < $dbVersion ? "--skip-opt --create-options" : "-all") . " --add-drop-table" . (EnvUtil::getRequest("extendins") == 1 ? " --extended-insert" : "") . "" . ("4.1" < $dbVersion && $sqlCompat == "MYSQL40" ? " --compatible=mysql40" : "") . " --host=\"" . $db["host"] . ($db["port"] ? is_numeric($db["port"]) ? " --port=" . $db["port"] : " --socket=\"" . $db["port"] . "\"" : "") . "\" --user=\"" . $db["username"] . "\" --password=\"" . $db["password"] . "\" \"" . $db["dbname"] . "\" " . $tablesstr . " > " . $dumpFile); if (@file_exists($dumpFile)) { if ($useZip) { $zip = new Zip(); $zipfilename = $backupFileName . ".zip"; $fp = fopen($dumpFile, "r"); $content = @fread($fp, filesize($dumpFile)); fclose($fp); $zip->addFile($idString . "# <?php exit();?>\n " . $setNames . "\n #" . $content, basename($dumpFile)); $fp = fopen($zipfilename, "w"); @fwrite($fp, $zip->file()); fclose($fp); @unlink($dumpFile); $filename = $backupFileName . ".zip"; unset($sqlDump); unset($zip); unset($content); return array("type" => "success", "msg" => Ibos::lang("Database export zip succeed", "dashboard.default"), "url" => Ibos::app()->urlManager->createUrl("dashboard/database/restore")); } else { if (@is_writeable($dumpFile)) { $fp = fopen($dumpFile, "rb+"); @fwrite($fp, $idString . "# <?php exit();?>\n " . $setNames . "\n #"); fclose($fp); } $filename = $backupFileName . ".sql"; return array("type" => "success", "msg" => Ibos::lang("Database export succeed", "dashboard.default"), "param" => Ibos::app()->urlManager->createUrl("dashboard/database/restore")); } } else { return array("type" => "error", "msg" => Ibos::lang("Database shell fail", "dashboard.default")); } } }