IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Upload de fichiers via PHP


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2016
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Upload de fichiers via PHP
    Bonjour à toutes et à tous !

    Je développe actuellement une plate-forme de téléchargement à destination d'un client (l'entreprise dans laquelle je travaille). Dans l'interface d'administration, le but est de pouvoir envoyer des fichiers via un input de type "file" dans un dossier pour pouvoir les afficher côté utilisateur et ainsi les télécharger.

    Or, jusqu'à présent, impossible d'envoyer des fichiers de plus de 3 Mo alors que le débit maximum donné avec mon hébergement est de 64 Mo. Aussi je requiers votre aide pour m'aider à voir là ou mon code cafouillerait (je tiens à prévenir que je reste un débutant dans le domaine)

    L'action se déroule dans trois fichiers : une page admin.php dans laquelle se trouve le formulaire d'envoi des fichiers ainsi qu'une page Ajaxfichiers.php dans laquelle l'upload est effectuée :

    Code admin.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
     
     
    <?php 
    	 include("Ajaxfichier.php"); 
    ?>
     
    <img alt="Nature" title="Nature" src="css/img/NatureBer.jpg" class="adminimg"/>
    <div class="formulaire">
    	<form method="POST" action="" enctype="multipart/form-data" id="formFichier">
    	<!-- Pour ajouter un fichier -->
    		<div class="fichier">
    			<label for="fichier">Ajouter un fichier (100Mo Max)</label></br>
    				<input type="hidden" name="MAX_FILE_SIZE" value="104857600"/>
    				<input type="text" class="chemin" id="chemin"/>
    				<input type="file" name="fichier[]" id="fichier" multiple="multiple"/>
    		</div>
     
    		</br>
    		<!-- Bouton d'envoi -->	
    		<input class="valid" type="submit" name="val" value="Envoyer" />
    	</form>
    	<div class="messageFichier"> </div>
    	<div class="affiche"></div>
    	<div class="download"></div>
     
     
     
    <?php 
    $dir= "./fichiers/";
     
    /******** Fonction pour supprimer des fichiers *********/
    function deletefile($file) {
    	if ($file != "") { 
    		unlink($file); // On efface.
    	}
    }
    	// Si on demande à supprimer, alors on efface le fichier
           if (!empty($_GET['action']) and $_GET['action'] == "suppr") {
    	    //var_dump($_GET);
    	    deletefile($dir.$_GET['p']);
    	    header('Location: admin');
    }	
     
    /******** Fonction pour lire et afficher les fichiers uploadés *********/
    $dossier = "./fichiers/";
    $repertoire = opendir($dossier); // On définit le répertoire dans lequel on souhaite travailler.
     
    /******** Fonction pour pagination des fichiers *********/
    function pagination() {
     
    	$filesCount = glob("./fichiers/*.*");
    	$nbfiles = count($filesCount);
    	$pagination = "";
    	//echo $nbfiles;
    	if ($nbfiles > 5) {
    		$nbperpage = 5;
     
    		// On définit le nombre de page à créer
    		$nbpages=ceil($nbfiles/$nbperpage);
     
    		// On fait une boucle pour afficher la pagination
    		if($_GET["p"] > 1) {
    			$pagination.="<a class='Lienpagination' href='admin-". ($_GET["p"]-1) ."'><</a> ";
    		}
    		for ($i =1; $i <= $nbpages; $i++) {
    			$pagination .="<a class='Lienpagination' href='admin-". $i ."'>". $i ."</a> ";
    		}
    		if($_GET["p"]<$nbpages) {
    			$pagination.="<a class='Lienpagination' href='admin-". ($_GET["p"]+1) ."'>></a> ";
    		}
    	}	
    	return $pagination;
    }
    	// Vérification de l'existance du dossier
    	if (is_dir($dir)) {
    		// Vérification du contenu
    		if ($dossier = opendir($dir)) {
     
    			// Affichage de l'entête du tableau
    			$begintab = "
    				<div class='tabetform'>
    					<table>
    						<thead>
    							<tr>
    								<th class='hand'>Nom du fichier</th>
    								<th class='hand'>Taille</th>
    								<th class='hand'>Date d'ajout</th>
    								<th class='hand'>Action</th>
    							</tr>
    						</thead>
    						<tbody>";
     
    			// Boucle tant qu'on a pas fait le tour des fichiers
    			$numFichier = 1;
    			while (($file=readdir($dossier)) !=false) {
     
    				// Afficher le nom et le type si ce n'est pas un élément du système
    				if ($file != '.' && $file != ".." && preg_match('#\.(pdf)$#i', $file)) {
    												//   |_ Changer en pdf pour la plate forme					
     
    					// SI le fichier fait parti de l'interval de la pagination alors on l'affiche
     
    					// SI le paramètre de page P n'est renseigné alors on le passe à 1
    					if (empty($_GET["p"])) {
    						$_GET["p"] = 1;
    					}
     
    					if (($numFichier >= (($_GET["p"] -1) * 5)) && ($numFichier <= ($_GET["p"] * 5))) {
     
    					/******** Fonction pour afficher la taille des fichiers *********/
    							// On affiche dans la variable les informations relatives au fichier
    							$taille=stat($dir.$file);
    							// On convertit et arrondit le résultat en Ko ou Mo
    							$size=$taille["size"];
     
    							if ($size >= 1048576) {
    								$size=(($taille["size"] / 1048576 * 100) / 100);
    								$final_size=round($size,2)." Mo";
    							} else {
    								$size=(($taille["size"] / 1024 * 100) / 100);
    								$final_size=round($size,2)." Ko";
    							}
     
    					/******** Fonction pour afficher la date d'ajout des fichiers *********/
    					$ladate = stat($dir.$file);												
    					$datefinal=date('d/m/Y', $ladate['atime']);
     
     
    					// Affiche des fichiers si fichier uploadé 
    					$begintab .= "
    							<tr>
    								<td class='file'><img class='imgtable' alt='logo Adobe' title='document PDF' src='./css/img/adobe_fichier.png'/>". $file ."</td>
    								<td class='size'>". $final_size ."</td> 
    								<td class='date'>".$datefinal."</td>
    								<td><a href=index.php?controler=admin&action=suppr&p=". $file ."><img src='css/img/croixrouge.png' alt='Croix rouge' title='supprimer' /></a></td>
    							</tr>
    						";
    					}
    					$numFichier++;
     
    			}		
    		}
    			$begintab .= "
    						</tbody>
    					</table>
    				</div>";	
     
    			echo $begintab;
    			echo "<div class='pagination'>".pagination()."</div>";
     
    		// On ferme la connexion
    		closedir($dossier);
    	}
    }
    ?>
     
    </div>
    <!-- Bloc gris en background -->
    <div class="bloc">
    </div>
    Et une page Ajaxfichiers.php (que j'include avant le chargement de la page admin.php.

    Code Ajaxfichiers.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    <?php 
    	//var_dump($_POST, $_FILES);
    	$message = "";
     
    if(!empty($_POST)) {
    	for ($i = 0; $i < sizeof($_FILES["fichier"]["name"]); $i++) {
    		// Si le fichier est bien renseigné alors on vérifie le type
    		if(!empty($_FILES["fichier"]) and $_FILES["fichier"]["name"][$i] != "") {
     
    			// Tableau des extensions gérées
    			$typeFichier = array (
    				"pdf",
    			);
    			// On remplace les espaces par des underscores 
    			$good=array("_");
    			$bad=array(" ");
    				// Le tout au sein du nom du fichier
    			$name=$_FILES["fichier"]["name"];
     
    			$filename=str_replace($bad,$good,$name);
     
    			// On récupère l'extension du fichier
    			$fichier=strtolower(substr(strrchr($filename[$i], "."),1));
     
    			//Pour gérer la taille du fichier
    			$size=$_FILES["fichier"]["size"];
    			$sizemax=104857600;
     
    			if ($size >= $sizemax) {
     
    				//Si l'extension est autorisée, on autorise le fichier
    				if (in_array($fichier, $typeFichier)) {
     
    					$destinationFichier = "../fichiers/". basename($filename[$i]);
     
    					// Si le fichier est bien envoyé, alors on affiche le message correspondant
    						if (move_uploaded_file($_FILES["fichier"]["tmp_name"][$i], $destinationFichier)) {
    							// Informations sur le fichier transféré
    							var_dump($fichier);
    							$message .="INFO : Transfert réussi <br/>";
    							$message .="Nom du fichier: ". $filename[$i] ."<br/>";
    							header('Location: admin');
     
    						} else {
    							// Message d'erreur en cas de transfert échoué
    							$message="Erreur ! Le transfert a échoué !";
    						}	
    				} else {
    					$message="Erreur ! Le type d'extension n'est pas autorisé !";
    				}	
    			} else {
    					$message="Erreur ! Le fichier est trop gros pour être uploadé !";
    			}
    		}
    	}
    }
     
    //On envoie la réponse 
    echo $message;
     
    ?>
    Sauriez-vous m'indiquer où est située mon erreur (si il y en a une car je n'arrive pas à la voir) et m'aider dans la résolution de ce problème ?

    Merci beaucoup !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    tu as oublié ton $i à plusieurs endroits :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $name=$_FILES["fichier"]["name"][$i];
    ....
    $size=$_FILES["fichier"]["size"][$i];

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2016
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour sabotage,

    Merci de ces précisions, j'ai modifié effectivement ledit fichier mais cela ne résout malheureusement pas le problème.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Contrôle ce que vaut $_FILES["fichier"]["error"] quand ça ne fonctionne pas.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2016
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Peut être que je ne contrôle pas comme il faut mais apparemment je n'ai pas d'erreur (il s'agit de la page Ajaxfichiers.php lignes 44-45 et 54-55)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    <?php 
    	//var_dump($_POST, $_FILES);
    	$message = "";
     
    if(!empty($_POST)) {
    	for ($i = 0; $i < sizeof($_FILES["fichier"]["name"]); $i++) {
    		// Si le fichier est bien renseigné alors on vérifie le type
    		if(!empty($_FILES["fichier"]) and $_FILES["fichier"]["name"][$i] != "") {
     
    			// Tableau des extensions gérées
    			$typeFichier = array (
    				"pdf",
    			);
    			// On remplace les espaces par des underscores 
    			$good=array("_");
    			$bad=array(" ");
    				// Le tout au sein du nom du fichier
    			$name=$_FILES["fichier"]["name"][$i];
     
    			$filename=str_replace($bad,$good,$name);
     
    			// On récupère l'extension du fichier
    			$fichier=strtolower(substr(strrchr($filename[$i], "."),1));
     
    			//Pour gérer la taille du fichier
    			$size=$_FILES["fichier"]["size"][$i];
    			$sizemax=104857600;
     
    			if ($size >= $sizemax) {
    				$error="";
    				//Si l'extension est autorisée, on autorise le fichier
    				if (in_array($fichier, $typeFichier)) {
     
    					$destinationFichier = "../fichiers/". basename($filename[$i]);
     
    					// Si le fichier est bien envoyé, alors on affiche le message correspondant
    						if (move_uploaded_file($_FILES["fichier"]["tmp_name"][$i], $destinationFichier)) {
    							// Informations sur le fichier transféré
    							var_dump($fichier);
    							$message .="INFO : Transfert réussi <br/>";
    							$message .="Nom du fichier: ". $filename[$i] ."<br/>";
    							//header('Location: admin');
    							$error=$_FILES["fichier"]["error"] ;
    							echo $error;
    						} else {
    							// Message d'erreur en cas de transfert échoué
    							$message="Erreur ! Le transfert a échoué !";
    						}	
    				} else {
    					$message="Erreur ! Le type d'extension n'est pas autorisé !";
    				}	
    			} else {
    					$message="Erreur ! Le fichier est trop gros pour être uploadé !";
    					$error=$_FILES["fichier"]["error"] ;
    					echo $error;
    			}
    		}
    	}
    }
     
    //On envoie la réponse 
    echo $message;
     
    ?>

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2016
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Au temps pour moi sabotage,

    Lors du contrôle, il me sort un Array contenant le nom du fichier dès lors qu'il n'excède pas 3 Mo. Sinon il passe outre ma fonction puisqu'il n'affiche même pas un Array vide.

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Salut,

    Tel que tu décris le problème, le soucis vient très probablement d'une limitation de ton serveur surtout si tu as fais plusieurs essais de plusieurs fichiers et que c'est la taille qui pose problème en renvoyant des super globales $_FILES et $_POST vides à partir d'un seuil précis. Typiquement cela ressemble à un dépassement de la configuration "post_max_size". Sinon il y a aussi la configuration "client_max_body_size" sur les serveurs "nginx" qui peut poser des problèmes d'upload.

    En cas de besoin tu peux utiliser ce module d'upload ajax/php qui permet de surpasser les limitations serveurs. Même avec ta config actuelle tu pourrais donc si besoin charger des très gros fichiers. Peut être utile aussi pour toutes les fonctionnalités implémentées : informations temps réel, sauvegardes partielles, crop et redimensionnements, personnalisation des retours etc. et pas long à tester puisque fourni dans un dossier pré configuré avec plus d'une quinzaine d'exemples directement fonctionnels.

Discussions similaires

  1. [PHP 5.0] Comment uploader des fichiers via formulaire en PHP
    Par gringo75011 dans le forum Langage
    Réponses: 3
    Dernier message: 27/01/2014, 08h27
  2. Upload de fichier via interface en PHP
    Par pgeissler dans le forum 1&1
    Réponses: 2
    Dernier message: 11/12/2012, 14h28
  3. Réponses: 4
    Dernier message: 22/02/2008, 12h43
  4. [FTP] upload de fichiers via PHP
    Par r-zo dans le forum Langage
    Réponses: 7
    Dernier message: 02/01/2006, 15h29
  5. Uploader des fichiers via ssh
    Par Michaël dans le forum Réseau
    Réponses: 3
    Dernier message: 13/05/2005, 20h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo