[RESOLU] gestion de fichier sous SVN grâce a PHP

Eléphanteau du PHP | 19 Messages

26 nov. 2014, 18:04

Bonjour,
Je voudrais savoir s'il était possible de rechercher, télécharger et éventuellement mettre à jour des fichiers contenus dans un serveur SVN grâce à PHP.
J'ai fais plusieurs recherches sur Google mais je suis un peu perdu là
Merci d'avance pour votre aide ^_^

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7156 Messages

27 nov. 2014, 00:46

Bonjour,

Il y a un module expérimental dont la doc est sur php.net qui semble correspondre à ce que tu recherches :
http://php.net/manual/fr/book.svn.php
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 19 Messages

27 nov. 2014, 00:53

Merci pour votre réponse,
J'avais vu ce site mais la fonction "svn_checkout" est ce qui me repond le plus à ce que je cherche mais ca permet de telercharger un répertoire entier, pas des fichiers spécifiques.

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7156 Messages

27 nov. 2014, 00:57

svn_cat, non ?
http://php.net/svn_cat

Sinon, vu que SVN se pilote en ligne de commande, tu peux très bien passer par ce biais là en PHP avec exec("svn [commande]");
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 19 Messages

27 nov. 2014, 01:03

AH Oui j'y avais pas pensé. Je vais essayer cela.
Merci beaucoup

Eléphanteau du PHP | 19 Messages

27 déc. 2014, 02:39

ReSalut,
Je suis bien avancé le projet, mais quand j'essaye de télécharger un fichier avec la commande svn_cat le fichier est bien mis dans une variable mais quand je fais echo de la variable aulieu de le télécharger, il l'affiche sur la page(ce qui est logique :oops: ). Il y'a t'il un moyen de télécharger le fichier aprés la commande svn_cat?

Eléphanteau du PHP | 19 Messages

27 déc. 2014, 03:09

Quand je fais:

Code : Tout sélectionner

$contents = svn_cat ( $url . '/trunk/French/number_entries_and_references.csv', 0 ); echo exec('svn cat'.$contents.'>>test.csv');
Ca exporte le fichier dans le repertoire racine mais je veux qu'il propose à l'utilisateur ou l'enregistrer.
Merci d'avance

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8726 Messages

27 déc. 2014, 13:06

Salut,

Le fichier est dans la variable $content, donc "il suffit" de demander à l'utilisateur, au pré allable, l'emplacement final sur le serveur.
A ce moment là la fonction file_put_contents permet d'écrire un fichier complet en une fois a l'emplacement voulut (pour peux que l'utilisateur ait le droit de le faire bien entendu).

Du coup la seconde ligne est un doublon de la première (même si la seconde peux tout faire en une fois).

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 19 Messages

27 déc. 2014, 15:06

Ah Oui c'est vrai Merci, ça marche. Pour plusieurs fichiers je dois creer un tableau de fichier et faire une boucle? Il y aurai pas un moyen de tout mettre dans une archive?

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8726 Messages

27 déc. 2014, 16:19

pour l'archive c'est réalisable tu peux utiliser ZipArchive pour cela, avec la méthode addFromString()

Effectivement tu n'as pas le choix il te faut une liste des fichiers. Après cela dépends d'où provient cette liste. D'un SGBD ou d'un svn list.

gloablement
- instance de zipArchive
- créer la liste de fichier s'il y a besoin (si provient d'un sgbd pas besoin c'est direct dans le while de traitement).
- Itération sur la liste des fichiers
Pour chaque fichier
- $archive->addFromString('le nom du fichier',svn_cat(......));
- ne pas oublier la méthode close() pour fermer correctement l'archive ;)

Et voila c'est fait :mrgreen:

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 19 Messages

27 déc. 2014, 16:31

Merci infiniment, je teste ça

Eléphanteau du PHP | 19 Messages

28 déc. 2014, 21:39

ReSalut ^^
j'ai réussi à écrire le code pour l'archivage

if (isset ( $_POST ['download'] )) {
	$the_folder = './tmp/';
	$zip_file_name = 'archived_name.zip';
	$download_file = true;
	$delete_file_after_download = true;
	class FlxZipArchive extends ZipArchive {
		public function addDir($location, $name) {
			$this->addEmptyDir ( $name );
			$this->addDirDo ( $location, $name );
		} // EO addDir;
		private function addDirDo($location, $name) {
			$name .= '/';
			$location .= '/';
			
			// Read all Files in Dir
			$dir = opendir ( $location );
			while ( $file = readdir ( $dir ) ) {
				if ($file == '.' || $file == '..')
					continue;
					// Rekursiv, If dir: FlxZipArchive::addDir(), else ::File();
				$do = (filetype ( $location . $file ) == 'dir') ? 'addDir' : 'addFile';
				$this->$do ( $location . $file, $name . $file );
			}
		} // EO addDirDo();
	}
	$za = new FlxZipArchive ();
	$res = $za->open ( $zip_file_name, ZipArchive::CREATE );
	if ($res === TRUE) {
		$za->addDir ( $the_folder, basename ( $the_folder ) );
		$za->close ();
	} else {
		echo 'Could not create a zip archive';
	}
	
	if ($download_file) {
		ob_get_clean ();
		header ( "Pragma: public" );
		header ( "Expires: 0" );
		header ( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
		header ( "Cache-Control: private", false );
		header ( "Content-Type: application/zip" );
		header ( "Content-Disposition: attachment; filename=" . basename ( $zip_file_name ) . ";" );
		header ( "Content-Transfer-Encoding: binary" );
		header ( "Content-Length: " . filesize ( $zip_file_name ) );
		readfile ( $zip_file_name );
		$za->close ();
	}
}
mais là j'ai un problème avec mon bouton download qui récupére les valeurs de ce select
			if (isset ( $_POST ['search'] )) {
						echo '<select multiple name="resultat[]" >';						
						$type_cat_result_selected = $_POST ['type_cat_result'];
						$result = svn_ls ( $url . '/trunk/' . $langue . '/' . $type_catt . '/' . $type_cat_result_selected );
						foreach ( $result as $element => $name ) {
							echo "<option  value=" . $url . '/trunk/' . $langue . '/' . $type_catt . '/' . $type_cat_result_selected . $element . ">" . $element . "</option>\n";
						}
					}
					echo '</select>';
					
					// print_r ( $result );
					
					if (isset ( $_POST ['resultat'] )) {
						echo 'begin ->';
						$resultat = $_POST ['resultat'];
						
						foreach ( $resultat as $item ) {
							echo $item;
							mkdir ( '/tmp/' );
							// chown('/tmp1','root');
							svn_checkout ( $item, dirname ( __FILE__ ) . '/tmp/' );
						}
						
						echo '<-End';
					}
Quand on clique sur le bouton download, ça commence directement le téléchargement sans récuprer les valeurs du Select et du coup j'ai une archive vide.

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8726 Messages

28 déc. 2014, 23:23

salut,

Je ne comprend le svn checkout suite à l'affichage de la liste, $_POST['resultat'] ne peux exister à ce moment là (ou alors c'est pas la même chose).

Est tu certain que le répertoire temporaire est bien alimenté ?

Pourquoi ne pas utiliser svn_cat, cela t'évite le fichier temporaire. (gros fichiers sur le svn ?)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 19 Messages

28 déc. 2014, 23:39

Si j'utilise "svn cat" alors ca me donnera pas la structure des dossiers des fichiers.

Actuellement aprés modification du code, le checkout ca marche maintenant si je veux télécharger des dossiers, mais ça marche pas pour les fichiers.

Eléphanteau du PHP | 19 Messages

29 déc. 2014, 05:05

Le serveur SVN contient des fichiers au format *.csv qui sont dans plusieurs sous repertoire. On doit pouvoir télécharger soit un ensemble de repertoire ou un ensemble de fichiers.
J'ai reussi a gerer cela avec plusieurs Select(option form) et à jouer avec les svn_ls. Mais c'est la partie checkout(si c'est un dossier a télécharger) oubien svn_cat(si c'est un ensemble de fichiers).
Le code ci-dessous ne marche que pour les dossiers mais la partie svn_export ne marche pas au niveau du code php mais quand je copie la même commande sur le terminal et que je l'execute ca export le fichier
<?php

if (isset ( $_POST ['download'] )) {
	if (isset ( $_POST ['resultat'] )) {
		$resultat = $_POST ['resultat'];
		//print_r ( $resultat );
		if (isset ( $_POST ['type_cat_result'] )) {
			$type_cat_result_selected = $_POST ['type_cat_result'];
			if ($type_cat_result_selected == "All") { //si c'est un dossier
				foreach ( $resultat as $item ) {
					mkdir (dirname ( __FILE__ ) . '/temp' );
					echo 'folder';
					echo $item;
					svn_checkout ( $item, dirname ( __FILE__ ) . '/temp' );
					}
			} else {//Si c'est des fichiers à télécharger
				echo 'file';
				foreach ( $resultat as $item ) {
					echo $item.'<br>	';
					exec('svn export '.$item.' '.dirname ( __FILE__ ) . '/temp');
					// svn_export ( $item, "/home/sirpapy/Documents/temp" );
				}
			}
		}
	}
	
	$the_folder = './tmp/';
	$zip_file_name = 'archived_name.zip';
	
	$download_file = true;
	class FlxZipArchive extends ZipArchive {
		/**
		 * Add a Dir with Files and Subdirs to the archive;;;;; @param string $location Real Location;;;; @param string $name Name in Archive;;; @author Nicolas Heimann;;;; @access private *
		 */
		public function addDir($location, $name) {
			$this->addEmptyDir ( $name );
			
			$this->addDirDo ( $location, $name );
		} // EO addDir;
		
		private function addDirDo($location, $name) {
			$name .= '/';
			$location .= '/';
			
			// Read all Files in Dir
			$dir = opendir ( $location );
			while ( $file = readdir ( $dir ) ) {
				if ($file == '.' || $file == '..')
					continue;
					// Rekursiv, If dir: FlxZipArchive::addDir(), else ::File();
				$do = (filetype ( $location . $file ) == 'dir') ? 'addDir' : 'addFile';
				$this->$do ( $location . $file, $name . $file );
			}
		} // EO addDirDo();
	}
	
	$za = new FlxZipArchive ();
	$res = $za->open ( $zip_file_name, ZipArchive::CREATE );
	if ($res === TRUE) {
		$za->addDir ( $the_folder, basename ( $the_folder ) );
		$za->close ();
	} else {
		echo 'Could not create a zip archive';
	}
	
	if ($download_file) {
		ob_get_clean ();
		header ( "Pragma: public" );
		header ( "Expires: 0" );
		header ( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
		header ( "Cache-Control: private", false );
		header ( "Content-Type: application/zip" );
		header ( "Content-Disposition: attachment; filename=" . basename ( $zip_file_name ) . ";" );
		header ( "Content-Transfer-Encoding: binary" );
		header ( "Content-Length: " . filesize ( $zip_file_name ) );
		readfile ( $zip_file_name );

		$za->close ();
	}
}
echo 'end';
?>