Autre system que blob pour stockage image

Eléphant du PHP | 388 Messages

02 avr. 2010, 08:25

Bonjour a tous,

En lisant plusieurs tutos et en faisant plusieurs test je me suis apperçu que le system de stockage photo dans une base sql était pas fait pour moi ( prend trop de place dans la table et de plus extrêmement lent ).

J'aurai voulu savoir si il était possible d'utiliser le stockage photo directement dans un répertoire et renvoyer dans la table photo l'url ou le chemin de la photos.

Exemple :

IdPhoto : 1
nomphoto: test
Url photo : /images/test.jpg

Est ce possible ?
Est ce conseillé ?
Comment doit je proceder pour envoyer l'url de la photo.

Merci de votre aide 8-|

ViPHP
ViPHP | 3607 Messages

02 avr. 2010, 08:58

Bonjour,

Bien sûr que le stockage d'une url plutôt que de l'image entière en Bdd est la plupart du temps préférable!
Après comment le faire, et bien au moment de l'enregistrement de ton formulaire d'envoi, tu insère l'url de l'image dans la bdd... je ne vois pas trop ce qui te bloques là?
Au passage un petit tuto sur l'envoi d'image par formulaire: http://www.siteduzero.com/tutoriel-3-37 ... laire.html

Mammouth du PHP | 985 Messages

02 avr. 2010, 09:01

Bien, c'est clair, une Bd n'a jamais été faite pour stocker des photos...
Le système de fichiers, lui, est fait pour cela.
Donc oui c'est tout à fait possible et plus que conseillé :)

Maintenant, peux tu être plus précis sur le but du stockage des urls des photos?
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphant du PHP | 388 Messages

02 avr. 2010, 10:32

Biensure, j'ai un site de petite annonce la personne peut poster une annonce avec photo.

Quand elle rempli le formulaire les données sont renvoyées vers la table annonce puis il y a la table images pour le stockage des photos.

comme cela la personne poste sont annonces cela uplodera la photo dans un dossier images puis le chemin de celle si sera envoyer dans la table.

De ce faite via clé étrangére l'annonce aura telle photo associé.

Eléphanteau du PHP | 27 Messages

02 avr. 2010, 11:06

Il est vrai que stocker des images en base de données n'est pas idéal, ne serait ce que pour l'aspect performance
Développeur PHP à temps perdu ...
PHP Maximus CMS , un cms plus petit PHP Minimus, un cms minimaliste PHP Nanomus, un pare feu pour votre site PHP Firewall

Eléphant du PHP | 388 Messages

03 avr. 2010, 20:05

En suivant vos conseils j'ai un script qui m'enregistre l'image dans un dossier le voici
<?php
	$dossier = 'Images/';
	$maxsize = '1048576';
	$maxwidth = '2000';
	$maxheight = '2000';

	if ($_FILES['icone']['error'] > 0) 
	{
		$erreur = 'Erreur lors du transfert';
	}
	else
	{
		if ($_FILES['icone']['size'] > $maxsize)
		{
			$erreur = 'Le fichier est trop gros';
		}
		else
		{
			$extensions_valides = array('jpg','jpeg','gif','png');
			$extension_upload = strtolower(  substr(  strrchr($_FILES['icone']['name'], '.'),1));
			
			if (in_array($extension_upload,$extensions_valides))
			{
				$image_sizes = getimagesize($_FILES['icone']['tmp_name']);
				
				if (!$image_sizes[0] > $maxwidth OR $image_sizes[1] > $maxheight) 
				{
					$erreur = 'Image trop grande';
				}
				else
				{
					$nom = "{$_FILES['icone']['name']}.{$extension_upload}";
					$resultat = move_uploaded_file($_FILES['icone']['tmp_name'],$dossier.$nom);					
					
				}
			}
			else
			{
				echo 'Extension incorect';
			}
		}
	}
?>

Le problème si je met une photo qui porte le meme nom celle ci se remplace automatiquement, il faudrait que j'inclus un message qui me dit le veuillez renommer la photo, ou bien un système pour changer le nom de la photo,
Voyez vous comment procéder ?
Deplus si j'uploade une photo qui s'appelle test.jpg, il va l'enregistrer en test.jpg.jpg

Eléphant du PHP | 428 Messages

03 avr. 2010, 20:35

Salut,

Je me permet de faire l'intrus dans la discussion pour te parler d'un système d'upload permettant l'upload de fichiers simple ou multiples.
J'ai en effet parcouru le web de long en large et j'ai développé mon propre système d'upload mais je me suis récemment tourné vers un système d'upload FLASH/JAVASCRIPT/PHP.

Les raisons en sont que ce système permet d'uploader de multiples fichiers placés en 'queue'. Mais il permet également et sans d'énormes connaissances de paramétrer le type de fichiers voulu, la taille maximale, etc ... Sans compter les autres tests que tu peux faire grâce à PHP.

Tu en fais ce que tu veux, mais voici le lien de DEMO :
http://demo.swfupload.org/

Le lien pour la documentation :
http://demo.swfupload.org/Documentation/

Un échantillon du fichier upload.php
http://swfupload.googlecode.com/svn/swf ... upload.php

Au besoin, d'autres echantillons son disponibles ici :
http://swfupload.googlecode.com/svn/swf ... 2/samples/

Le lien de téléchargement :
http://code.google.com/p/swfupload/


Je sais qu'il y aura peut être des remarques (et elles sont les bienvenues) mais c'est pour moi un très bon produit qui à su me satisfaire pour mon plus grand projet à ce jour : PHP DSMS.

En espérant t'avoir suggéré une chose qui te seras utile,
Raph

Eléphant du PHP | 388 Messages

04 avr. 2010, 08:03

je te remercie pour tes liens et ton system d'upload mais je préfère rester xhtml,css et php :) encore merci

Mammouth du PHP | 985 Messages

04 avr. 2010, 08:12

Ok donc la fonction que tu as besoin, c'est file_exists()
http://php.net/manual/fr/function.file-exists.php

Regarde le lien ci-dessus, les exemples...
Donc comme son nom l'indique , elle permet de vérifier si un fichier existe, donc tu vérifies si le fichier existe avec un if.
Ensuite si il existe, tu modifies le nom, par exemple tu ajoutes un numéro...
Si par contre le fichier n'existe pas, tu utilises un else pour cela, et bien tu continues normalement...
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphant du PHP | 388 Messages

04 avr. 2010, 08:23

Merci dr@ke j'essaye desuite une autre question bête, j'ai rajouter l'enregistrement dans ma table pour que l'url de la photo ce place dedans pour y faire appelle par la suite

j'ai
id_image
nom
description
image.

voici le code total qui rajoute dans la base

<?php
	$dossier = 'Images/';
	$maxsize = '1048576';
	$maxwidth = '2000';
	$maxheight = '2000';

	if ($_FILES['icone']['error'] > 0) 
	{
		$erreur = 'Erreur lors du transfert';
	}
	else
	{
		if ($_FILES['icone']['size'] > $maxsize)
		{
			$erreur = 'Le fichier est trop gros';
		}
		else
		{
			$extensions_valides = array('jpg','jpeg','gif','png');
			$extension_upload = strtolower(  substr(  strrchr($_FILES['icone']['name'], '.'),1));
			
			if (in_array($extension_upload,$extensions_valides))
			{
				$image_sizes = getimagesize($_FILES['icone']['tmp_name']);
				
				if (!$image_sizes[0] > $maxwidth OR $image_sizes[1] > $maxheight) 
				{
					$erreur = 'Image trop grande';
				}
				else
				{
					$nom = "{$_FILES['icone']['name']}.{$extension_upload}";
					$resultat = move_uploaded_file($_FILES['icone']['tmp_name'],$dossier.$nom);	if ($resultat)
					{
						echo 'Transfert réussi';
						mysql_connect("aaaa", "aaaa", "aaaaa");
						mysql_select_db("aaaaa");
						
						$nom = addslashes($_POST['nom']);
						$image = $dossier.$nom;
						$description = addslashes($_POST['description']);
						
						mysql_query("INSERT INTO images VALUES('','" . $nom . "', '" . $description. "', '" . $image . "')");
					}
					else
					{
						echo 'Echec du transfert';
					}
				}
			}
			else
			{
				echo 'Extension incorect';
			}
		}
	}
?>
la table se rempli bien cependant il me met dans image l'url du dossier soit image : Images\
Mais j'ai pas le nom de la photo se souhaiterai qu'il mette exemple images\test.jpg

pour qu'il puisse bien ciblé ou cela se trouve

Eléphant du PHP | 388 Messages

04 avr. 2010, 08:39

Ok donc la fonction que tu as besoin, c'est file_exists()
http://php.net/manual/fr/function.file-exists.php

Regarde le lien ci-dessus, les exemples...
Donc comme son nom l'indique , elle permet de vérifier si un fichier existe, donc tu vérifies si le fichier existe avec un if.
Ensuite si il existe, tu modifies le nom, par exemple tu ajoutes un numéro...
Si par contre le fichier n'existe pas, tu utilises un else pour cela, et bien tu continues normalement...
Je viens d'essayer se que tu ma dit juste en mettant que le fichier exister déjà justa pour voir se que cela donne malheuresement rien ne se passe je pence que j'ai un petit probléme

voici se que je viens de faire
<?php
	$dossier = 'Images/';
	$maxsize = '1048576';
	$maxwidth = '2000';
	$maxheight = '2000';

	if ($_FILES['icone']['error'] > 0) 
	{
		$erreur = 'Erreur lors du transfert';
	}
	else
	{
		if ($_FILES['icone']['size'] > $maxsize)
		{
			$erreur = 'Le fichier est trop gros';
		}
		else
		{
			$extensions_valides = array('jpg','jpeg','gif','png');
			$extension_upload = strtolower(  substr(  strrchr($_FILES['icone']['name'], '.'),1));
			
			if (in_array($extension_upload,$extensions_valides))
			{
				$image_sizes = getimagesize($_FILES['icone']['tmp_name']);
				
				if (!$image_sizes[0] > $maxwidth OR $image_sizes[1] > $maxheight) 
				{
					$erreur = 'Image trop grande';
				
				
					if (file_exists($_FILES['icone'])) 
					{
						echo "Le fichier  existe.";
					}
						
						else
							{
							$nom = "{$_FILES['icone']['name']}.{$extension_upload}";
							$resultat = move_uploaded_file($_FILES['icone']['tmp_name'],$dossier.$nom);	if ($resultat)
							{
								echo 'Transfert réussi';
								mysql_connect("aaaa", "aaaaa", "aaaaa");
								mysql_select_db("aaaaa");
						
								$nom = addslashes($_POST['nom']);
								$image = $dossier.$nom;
								$description = addslashes($_POST['description']);
						
								mysql_query("INSERT INTO images VALUES('','" . $nom . "', '" . $description. "', '" . $image . "')");
							}
					else
					{
						echo 'Echec du transfert';
					}
				
				
							}
				}
			}
			else
			{
				echo 'Extension incorect';
			}
		}
	}
?>


Mammouth du PHP | 985 Messages

04 avr. 2010, 08:40

Rappelle toi qu'il ne faut pas utiliser addslashes() pour protéger les données dans les requêtes SQL car il existe une fonction faite exprès pour cela et qui donc qui le fait encore mieux.
Cette fonction s'appelle: mysql_real_escape_string()
http://php.net/manual/fr/function.mysql ... string.php
Mais attention vue que cette fonction ne fonctionne qu'avec les données SQL, rappelle toi bien aussi qu'il faut l'utiliser seulement quand la connexion SQL est établie.
Donc après: mysql_connect()

Pour en revenir à ton soucis, au lieu d'insérer $_POST['nom'], essaye à la place d'insérer la variable $nom.
Car elle est déjà définie juste avant, regarde:
$nom = "{$_FILES['icone']['name']}.{$extension_upload}";
Donc elle est censée contenir le nom du fichier :)

Donc remplace ta partie SQL par celle ci, puis test:
                                                mysql_connect("aaaa", "aaaa", "aaaaa");
                                                mysql_select_db("aaaaa");
                                               
                                                $nom = mysql_real_escape_string($nom);
                                                $image = $dossier.$nom;
                                                $description = mysql_real_escape_string($_POST['description']);
                                               
                                                mysql_query("INSERT INTO images VALUES('','" . $nom . "', '" . $description. "', '" . $image . "')");
Ensuite on regardera pour ton file_exist().
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphant du PHP | 388 Messages

04 avr. 2010, 08:47

exact cela marche déjà mieu dans la base dans la partie images on obtiens en resultat : Images/IMG_0037.jpg.jpg

Merci de ton aide mais c'est tu pourquoi il me place deux fois l'extension ?

cela viendrai pas de cette partie par hazard
$extension_upload = strtolower(  substr(  strrchr($_FILES['icone']['name'], '.'),1));
Modifié en dernier par spidercrash le 04 avr. 2010, 08:52, modifié 2 fois.

Mammouth du PHP | 985 Messages

04 avr. 2010, 08:52

je pense que c'est parceque tu rajoutes l'extension au nom du fichier qui la posséde déjà ici:
$nom = "{$_FILES['icone']['name']}.{$extension_upload}";
Donc remplace par, et test ceci:
$nom = $_FILES['icone']['name'];
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
AB
ViPHP | 5818 Messages

04 avr. 2010, 09:04

Pour que tes fichiers soient valides il ne faut pas qu'ils contiennent de caractères accentués ou spéciaux etc.
Il faudrait inclure une conversion de caractères dans ton script au cas où un visiteur rentre des caractères non valides.