2015-04-28 4 views
0

Je souhaite définir le chemin du fichier de téléchargement de mon fichier de sauvegarde de base de données au format SQL dans la fonction indiquée ci-dessous. Chaque fois que j'essayé cette fonction, le fichier est téléchargé dans le dossier de téléchargement sur mon ordinateur local, mais je veux le télécharger dans un répertoire spécifié sur mon serveur à la place:Définir le chemin du fichier de téléchargement pour la sauvegarde de base de données dans CakePHP

function admin_database_mysql_dump($tables = '*') { 
ini_set('memory_limit', '1024M'); 
set_time_limit(0); 

$return = ''; 

$modelName = $this->modelClass; 

$dataSource = $this->{$modelName}->getDataSource(); 
$databaseName = $dataSource->getSchemaName(); 


// Do a short header 
$return .= '-- Database: `' . $databaseName . '`' . "\n"; 
$return .= '-- Generation time: ' . date('D jS M Y H:i:s') . "\n\n\n"; 


if ($tables == '*') { 
    $tables = array(); 
    $result = $this->{$modelName}->query('SHOW TABLES'); 
    foreach($result as $resultKey => $resultValue){ 
     $tables[] = current($resultValue['TABLE_NAMES']); 
    } 
} else { 
    $tables = is_array($tables) ? $tables : explode(',', $tables); 
} 

// Run through all the tables 
foreach ($tables as $table) { 
    $tableData = $this->{$modelName}->query('SELECT * FROM ' . $table); 

    $return .= 'DROP TABLE IF EXISTS ' . $table . ';'; 
    $createTableResult = $this->{$modelName}->query('SHOW CREATE TABLE ' . $table); 
    $createTableEntry = current(current($createTableResult)); 
    $return .= "\n\n" . $createTableEntry['Create Table'] . ";\n\n"; 

    // Output the table data 
    foreach($tableData as $tableDataIndex => $tableDataDetails) { 

     $return .= 'INSERT INTO ' . $table . ' VALUES('; 

     foreach($tableDataDetails[$table] as $dataKey => $dataValue) { 

      if(is_null($dataValue)){ 
       $escapedDataValue = 'NULL'; 
      } 
      else { 
       // Convert the encoding 
       $escapedDataValue = mb_convert_encoding($dataValue, "UTF-8", "ISO-8859-1"); 

       // Escape any apostrophes using the datasource of the model. 
       $escapedDataValue = $this->{$modelName}->getDataSource()->value($escapedDataValue); 
      } 

      $tableDataDetails[$table][$dataKey] = $escapedDataValue; 
     } 
     $return .= implode(',', $tableDataDetails[$table]); 

     $return .= ");\n"; 
    } 

    $return .= "\n\n\n"; 
} 

// Set the default file name 
$fileName = $databaseName . '-backup-' . date('Y-m-d_H-i-s') . '.sql'; 

// Serve the file as a download 
$this->autoRender = false; 
$this->response->type('Content-Type: text/x-sql'); 
$this->response->download($fileName); 
$this->response->body($return); 
} 
+0

vous voulez qu'il soit lui-même sur le serveur? – Abhishek

+0

je veux juste changer l'emplacement de téléchargement à mon autre répertoire au lieu du dossier de téléchargement (par défaut) – tarun

+0

l'emplacement d'enregistrer un fichier à partir d'un navigateur est basé sur le navigateur lui-même, – Abhishek

Répondre

1

Ajouter cela au fond de votre admin_database_mysql_dump fonction:

file_put_contents (ROOT.'/app/webroot/sql/' . $fileName , $return); 

Ceci va télécharger le fichier sql dans un dossier sql dans votre répertoire app/webroot.

Toutefois, cela vous permettra également de télécharger une copie sur votre ordinateur local. Si vous ne voulez pas faire simplement supprimer les lignes suivantes:

$this->response->download($fileName); 
$this->response->body($return); 

... et ajouter une nouvelle ligne pour rediriger une fois le fichier généré. Quelque chose de semblable à:

$this->redirect($this->referer()); 

donc tout à fait le fond de votre fonction révisée devrait ressembler à ceci:

// Set the default file name 
$fileName = $databaseName . '-backup-' . date('Y-m-d_H-i-s') . '.sql'; 

// Serve the file as a download 
$this->autoRender = false; 
$this->response->type('Content-Type: text/x-sql'); 

//these two lines should be removed 
// $this->response->download($fileName); 
// $this->response->body($return); 

//add this to write the file to server 
file_put_contents (ROOT.'/app/tmp/' . $fileName , $return); 

//add this to redirect the browser to the referer 
$this->redirect($this->referer()); 
+0

Est-ce que cela a résolu le problème? – McWayWeb