Téléchargement de fichier (UPLOAD)

  1. CODE PHP
  2. Formulaire HTML
  3. Page HTML+PHP en entier (sans commentaire)
  4. Commentaires
  5. Télécharger le script `upload.php`

N.B.: le fichier s'appelle upload.php dans l'exemple.

I. CODE PHP

<?php
if ( !defined('BASE_DIR') ) { define('BASE_DIR', $_SERVER['DOCUMENT_ROOT'].'/'); }
echo '<?xml version="1.0" encoding="iso-8859-1"?>'."\n";

// variable affichant un message de confirmation ou d'erreur
$strMsg = '';

// Détection d'un clique sur le bouton 'cmdupload'
// si le bouton a été cliqué et que sa valeur n'est pas vide
if ( isset($_POST['cmdupload']) && !empty($_POST['cmdupload']) ) {
	// exécution de la fonction de chargement avec le nom du champ input
	if ( fileUpload('fichier') )
		$strMsg = '<p>Envoie avec succès du fichier </p>';
	else
		$strMsg = '<p>Erreur lors de l\'envoi du fichier</p>';
}

// fonction de téléchargement
function fileUpload($pstrInputName) {
	$blnRetour = false;
	// regarder si la chaine n'est pas vide et que le fichier est bien
	// charger sur le serveur (dans un répertoire temporaire)
	if ( !empty($pstrInputName) && is_uploaded_file($_FILES[$pstrInputName]['tmp_name']) ) {
		/*
			Nom temporaire       : $_FILES[$pstrInputName]['tmp_name'];
			Nom du fichier       : $_FILES[$pstrInputName]['name'];
			Taille du fichier    : $_FILES[$pstrInputName]['size'];
			Type Mime du fichier : $_FILES[$pstrInputName]['type'];
		*/

		// strRepertoire représente le dossier ou vous voulez mettre le fichier
		// par exemple, mettre 'images/' pour le mettre dans le répertoire images
		$strRepertoire = '';
		$strNom        = $_FILES[$pstrInputName]['name'];

		// construction du nom du fichier
		$strNomFichier =  BASE_DIR.$strRepertoire.$strNom;

		// Déplacement du fichier
		$blnRetour = move_uploaded_file($_FILES[$pstrInputName]['tmp_name'],
		                                $strNomFichier);
	}
	return $blnRetour;
}
?>
		

II. Formulaire HTML

<!DOCTYPE html 
	PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
	<head>
		<title>Téléchargement d'un fichier </title>
		<meta name="auteur" content="YanSanMo" />
		<meta name="source" content="http://www.example.com/" />
	</head>
	<body>

		<h1>Téléchargement d'un fichier</h1>

		<!-- FORMULAIRE DE TELECHARGEMENT -->
		<!-- Obligatoire: 
			Encryption du formulaire: multipart/form-data
			Champ input de type: FILE
			Champ hidden avec la propriété name à MAX_FILE_SIZE 
				et la valeur exprimée en octets
		-->
		<form enctype="multipart/form-data" method="post" action="upload.php">
			Fichier: <input type="file" name="fichier" size="35" />
			<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
			<input type="submit" value="Envoyer" name="cmdupload" />
			<input type="reset" value="Vider" />
		</form>

		<!-- INSTRUCTION SUR L'USAGE DU FORMULAIRE -->
		<p>S.V.P. cliquez une <strong>seule fois</strong> et attendez 
		le message de confirmation.</p>

		<!-- Affichage du message d'erreur ou de confirmation -->
		<?=$strMsg ?>

	</body>
</html>

N.B.: En gras, les liens entre la page HTML et le script PHP.

III. Page HTML+PHP en entier (sans commentaire)

<?php
if ( !defined('BASE_DIR') ) { define('BASE_DIR', $_SERVER['DOCUMENT_ROOT'].'/'); }
echo '<?xml version="1.0" encoding="iso-8859-1"?>'."\n";
$strMsg = '';
if ( isset($_POST['cmdupload']) && !empty($_POST['cmdupload']) )
{
	if ( fileUpload('fichier') )
		$strMsg = '<p>Envoie avec succès du fichier </p>';
	else
		$strMsg = '<p>Erreur lors de l\'envoi du fichier</p>';
}

function fileUpload($pstrInputName)
{
	$blnRetour = false;
	if ( !empty($pstrInputName) && is_uploaded_file($_FILES[$pstrInputName]['tmp_name']) )
	{
		$strRepertoire = '';
		$strNom        = $_FILES[$pstrInputName]['name'];
		$strNomFichier =  BASE_DIR.$strRepertoire.$strNom;
		$blnRetour = move_uploaded_file($_FILES[$pstrInputName]['tmp_name'],
		                                $strNomFichier);
	}
	return $blnRetour;
}
?>
<!DOCTYPE html 
	PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
	<head>
		<title>Téléchargement d'un fichier </title>
		<meta name="auteur" content="YanSanMo" />
		<meta name="source" content="http://www.example.com/" />
	</head>
	<body>

		<h1>Téléchargement d'un fichier</h1>

		<form enctype="multipart/form-data" method="post" action="upload.php">
			Fichier: <input type="file" name="fichier" size="35" />
			<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
			<input type="submit" value="Envoyer" name="cmdupload" />
			<input type="reset" value="Vider" />
		</form>

		<p>S.V.P. cliquez une <strong>seule fois</strong> et 
		attendez le message de confirmation.</p>

		<?=$strMsg ?>

	</body>
</html>
		

IV. Commentaires

Script source de Nico: Forum PHP (10-07-2002 10:34)

La taille du fichier est limitée à 200ko par Multimania. Pourquoi alors ne pas utiliser les fonctions de FTP? Parce que ces fonctions sont inactives sur Multimania.

Après un micro-litige avec Philiweb tout s'est finalement bien réglé et tout le monde est content ;-). Je vous invite à faire un tour sur son site web...

Dans la fonction fileUpload(), on pourrait détecter le type de fichier d'après le type-mime.
Voici un petit tableau des types que j'ai testé jusqu'à maintenant:

Extension Type Mime Description
.txttext/plainDocument Texte
.htmtext/htmlPage HTML
.gifimage/gifImage GIF
.jpgimage/pjpegImage JPEG
.wmltext/vnd.wap.wmlWAP
.svgsvg/xmlDocument SVG
.*application/octet-streamtous les fichiers binaire