Création sites internet Bassin d'Arcachon - La Teste de Buch - Gujan Mestras - Biganos - Le Teich - Mios - Marcheprime - Audenge - Lanton - Andernos - Arés - Lège Cap Ferret

Upload de plusieurs images sans recharger la page avec jQuery et PHP

Voici comment créer un système d’upload d’image à la volée avec jQuery et php. Ce module vous donne la possibilité d’envoyer des images en ligne depuis votre ordinateur sans recharger la page.

Vous pouvez consulter la démonstration ici : Démo

Fichier HTML :

<div id="wrapAll">

			<div id='preview'>
			</div>

			<form id="uploadForm" method="post" enctype="multipart/form-data" action='ajaximage.php'>
				Sélectionner les images : 

				<div id='uploadStatus' style='display:none'><img src="loader.gif" alt="Uploading...."/></div>

				<div id='imgUploadBtn'>
					<input type="file" multiple="multiple" name="imgUpload[]" id="imgUpload" accept="image/*" />
				</div>
			</form>

	</div>

Code Javascript :

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

	<script type="text/javascript" src="jquery.form.bassm.js"></script>

	<script type="text/javascript" >
	$(document).ready(function() { 

        $('#imgUpload').on('change', function(){ 

			$("#uploadForm").ajaxForm({
				target: '#preview', 
				//clearForm: true,
				resetForm: true,
			    beforeSubmit:function(){ 
					$("#uploadStatus").show();
					$("#imgUploadBtn").hide();
				}, 
				success:function(){ 
					$("#uploadStatus").hide();
					$("#imgUploadBtn").show();
				}, 
				error:function(){ 
					$("#uploadStatus").hide();
					$("#imgUploadBtn").show();
				} }).submit();

		});

	    }); 
	</script>
Voici le fichier jquery.form.bassm.js utilisé dans le script.

Fichier ajaximage.php :

<?php
//Répertoire ou seront placés les images
$pathTo 	= "uploads/";
$maxSize 	= '0.2'; //en Mo

// récupère l'extension du fichier
function getExtension($str)
{
	$i = strrpos($str,".");
	if (!$i)
	{
		return "";
	}
	$l = strlen($str) - $i;
	$ext = substr($str,$i+1,$l);
	$ext = strtolower($ext);
	return $ext;
}

function cleanFileName ($chaine, $extension)
{
	
	setlocale(LC_ALL, 'fr_FR');

	$chaine = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $chaine);

	$chaine = preg_replace('#[^0-9a-z]+#i', '-', $chaine);

	while(strpos($chaine, '--') !== false)
	{
		$chaine = str_replace('--', '-', $chaine);
	}

	$chaine = trim($chaine, '-');
	$chaine = strtolower($chaine);
	$chaine = preg_replace("@(-$extension)@", "", $chaine); //pour afficher l'extension
	return $chaine;
}

$valid_formats = array("jpg", "jpeg", "png", "gif", "bmp");

$valid_formats = array("image/gif", "image/jpeg", "image/pjpeg", "image/png", "image/bmp");


if(isset($_POST) AND $_SERVER['REQUEST_METHOD'] == "POST")
{
	$images = $_FILES['imgUpload']; 

	$count = count($images['name']);

	$msgError = $msgSuccess = '';
	$error = 0;
	$uploaded = 0;
	for ($i=0; $i < $count; $i++) 
	{ 
		# code...
		$type = $images['type'][$i];
		$name = $images['name'][$i];
		$size = $images['size'][$i];

		if(strlen($name))
		{
			$ext = getExtension($name);
			if(in_array($type,$valid_formats))
			{
				// Vérification de la taille de l'image
				if($size < (1024* (1024 * $maxSize)) ) 
				{
					$newImageUploaded = cleanFileName($name, $ext).'-'.time().'.'.$ext;
					$tmp = $images['tmp_name'][$i];
					if(move_uploaded_file($tmp, $pathTo.$newImageUploaded))
					{
						$msgSuccess .= "<img src='uploads/".$newImageUploaded."' class='preview'>";
						$uploaded = 1;
					}
					else
					{
						$error = 1;
						$msgError .=  "Erreur";	
					}
					
				}
				else
				{
					$error = 1;
					$msgError .=  "L'image ne doit pas dépasser la taille de ". 1000 * $maxSize ."Ko"; 
				}
			}
			else
			{
				$error = 1;
				$msgError .=  "Format de fichier invalide ...\n"; 
			}
		}
	}
	if ($uploaded == 1)
	{
		echo $msgSuccess;
	}
	else if ($uploaded == 0 && $error == 1)
	{
		echo $msgError;
	}
	else {
		//echo $msgSuccess;
	}

	exit();
}
?>

Fichier CSS :

#wrapAll { width: 1000px; margin: 0 auto;}

#preview img { max-width: 150px; max-height: 150px; padding: 5px; margin: 5px; border: 1px solid #e1e1e1; }

Bien entendu ce script peut être amélioré en ajoutant une interaction avec une table user pour ajouter une photo de profil par exemple.

A noter que si vous utilisez une version de jQuery antérieure à 1.9 vous pouvez remplacer .on() par .live()

//$('#imgUpload').on('change', function(){ 

$('#imgUpload').live('change', function(){

Si vous souhaitez ajouter les images une par une voici ce qu’il faut changer dans le code javascript

<!--<input type="file" multiple="multiple" name="imgUpload[]" id="imgUpload" accept="image/*" />-->

<input type="file" name="imgUpload[]" id="imgUpload" accept="image/*" />

Vous pouvez consulter la démonstration ici : Démo

10 réponses à “Upload de plusieurs images sans recharger la page avec jQuery et PHP”

  1. glm dit :

    salut ! , les codes ne marche pas chez moi

  2. Dootech dit :

    Est ce que vous pouvez indiquez l’erreur qui s’affiche ?

  3. glm dit :

    l’erreur est de la forme
    Not Found

    The requested URL /upload avec ajax/ajaximage.php was not found on this server.

    je besoin de voir votre page ajaximage.php

  4. Dootech dit :

    Je vous envois le fichier par email

  5. yassine dit :

    svp est sque tu peut méttre un fichier a télécharger qui contient le code et déja tester et fonctionne, merci

  6. Geeknew dit :

    Bonjour

    J’ai la même erreur que glm pourrait-je avoir le fichier ajaximage.php. merci

  7. Dootech dit :

    Bonjour,
    Vous pouvez télécharger le fichier ajaximage.php depuis mon dropboox
    https://db.tt/Y5kG5GmZ

  8. Patrick dit :

    salut, j’ai essayé mais désolé, votre script est incomplet. il me donne l’erreur:
     »
    Not Found
    The requested URL /test/uploader/ajaximage.php was not found on this server.

     »
    si vous pouvez m’envoyer le script de la page ajaximage.php !

    merci !

  9. Ayoub dit :

    les codes ne marche pas chez moi :/ aussi

  10. Dootech dit :

    Oui il manquait le contenu du fichier ajaximage.php, je viens de m’en apercevoir. Je viens de l’ajouter dans l’article.
    Vérifiez et dites moi si cela fonctionne.