Problème de syntaxe

Belokan
Invité n'ayant pas de compte PHPfrance

14 juin 2012, 17:43

Bonjour à tous !

Je me décide enfin à écrire pour trouver une réponse à mon problème.

En effet, cela fait maintenant plus de 2 jours que j'essaye de trouver la bonne syntaxe pour le code ci-dessous.

Voilà ce que je souhaite faire et ce qui fonctionne :

1/ J'ai créer, à partir de divers scripts, un script permettant d'uploader un fichier. En uploadant celui-ci, je souhaite :
1. Vérifier le type de fichier (ex. : pdf, avi, jpg, etc.) et si celui-ci est valide alors on passe à l'étape suivante, sinon on a un message d'alerte.
2. Vérifier son poids, si celui-ci ne dépasse pas un poids maximal et si tel est le cas, alors on a un message d'alert.
3. Si tous les autres critères sont valides, alors on vérifie si le fichier porte le même nom qu'un fichier existant se trouvant dans le même dossier, et si c'est le cas, alors on ajoute la date à son nom, sinon on copie simplement le fichier avec sont nom.
Et si possible, supprimer les espaces dans le fichier par le code suivant :
$extension_upload = substr( strrchr($_FILES['fichier']['name'], '.') ,1); 

Ce qui fonctionne :
Le dernier point (n°3) fonctionne, à savoir que j'upload un fichier, s'il n'est pas existant, alors il est copié tel quel, sinon la date est ajouté à son nom, mais laisse les espaces, donc le code cité ci-dessus ne fonctionne pas.

Mais mon soucis, c'est que j'upload tout et n'importe quoi, c'est à dire que je peux uploader des fichiers qui ne se retrouvent pas dans mon tableau d'acceptation, et en plus, j'upload sans tenir compte du poids.

Donc en somme, j'upload sans vérification au préalable, ce qui me fait dire que le script ne tient compte QUE de la partie d'ajout de la date (ligne 53 à 62).

Je me débrouille mieux en html qu'en PHP, mais là, j'ai essayé toutes les combinaisons qui me paraissaient faisables et logiques.

Donc j'en appelle à vos connaissance et à votre savoir-faire.

Un grand merci anticipé à ceux qui prennent de leur temps pour me guider, voire me remettre le script dans une syntaxe correcte.

LES ELEMENTS :
(1- Le html nommé "upload.html" et 2- Le script PHP nommé "ulpoad.php3)


***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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Multi-upload facile avec JQUERY</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body>
<form enctype="multipart/form-data" action="upload.php3" method="post">
Fichier : <input name="fichier" type="file">
<input type="submit" value="Envoyer">
</form>
</body>
</html>



***PHP***
<?
// Taille maximum
$MAX_FILE_SIZE = 100;

// Dossier de destination du fichier
$folder = "upload/";

// Tableau array des différents types
$allowed_types = array(
"image/bmp", 
"image/gif", 
"image/pjpeg", 
"image/jpeg", 
"image/jpg", 
"image/png", 
"image/tiff",
"application/postscript",
"image/psd",
"application/x-shockwave-flash", 
"multipart/x-zip", 
"application/msword", 
"application/excel",
"application/vnd.ms-powerpoint", 
"application/pdf",
"text/html", 
"text/css",
"audio/aiff",
"audio/mpeg",
"audio/wav",
"audio/x-ms-wma",
"video/msvideo", 
"video/avi",
"video/mpeg",
"video/x-ms-wmv"
);

// Variables récupérées par méthode POST du formulaire
$fname = $_FILES['fichier']['name'];
$ftype = $_FILES ['fichier']['type'];
$fsize = $_FILES ['fichier']['size'];
$ftmp = $_FILES ['fichier']['tmp_name'];
$extension_upload = substr( strrchr($_FILES['fichier']['name'], '.') ,1); 

// Divers tests afin de savoir si :

// Le format de fichier correspond à notre tableau array
if(!in_array($ftype, $allowed_types)){$error = 1;}

// La taille du fichier n'est pas dépassée
if($fsize > $MAX_FILE_SIZE){$error = 2;}

// Si le fichier existe déjà
if (file_exists('./upload/'.$fname))
{
//Si le fichier existe, on rajoute dans son nom, la date et l'heure pour le différencier de la première (comme ça, on est sûr de ne pas avoir 2 images avec le même nom)
$nom_final= preg_replace("`.$extension_upload`is",date("ldSFY-h.i.s-A").".$extension_upload",$fname);
}
else {
$nom_final=$fname; //l'image n'existe pas on garde le même nom
}
//on déplace l'image dans le répertoire final
move_uploaded_file($ftmp,'./upload/'.$nom_final); {$error = 0;}


// Messages avec apostrophe
$m1 = ' à l\'emplacement suivant : ';
$m2 = htmlspecialchars($m1);


// Switch servant simplement à la gestion des erreures
switch($error){
case'0':
echo("<h3>Fichier correctement envoyé !</h3>");
echo ('<br/>');
echo ('<br/>');
//L'image apparait après validation avec son nom, son emplacement, son type et son poids
echo '<img src="./upload/'.$nom_final.'" border="0" />';
echo "<br/><br/>Le nom dorigine du fichier est '" . $fname . "'.<br/>";
echo "Le fichier a été téléchargé avec succès"  . $m2  . '/upload/'.$nom_final . "'<br/>";
echo "Le type du fichier est '" . $ftype . "'.<br/>";
echo "La taille du fichier est de '" . $fsize . " octets'.<br/>";
echo '<a href="javascript:history.back();" align="center">Retour</a>';
break;
case'1':
echo("Format de fichier incorrecte.");
break;
case'2':
echo("Fichier trop volumineux.");
break;
}
?>


MERCI pour toutes vos futures réponses

Belokan

PS : si ce n'est pas le bon endroit pour poster cette demande, merci de m'indiquer dans quelle partie du forum je dois la poster.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

14 juin 2012, 17:55

salut,

le problème dans ton code c'est que quoi qu'il arrive tu fait toujours le move_uploded_file.

il faut le conditionner de façon a ce qu'il ne soit exécuter que lorsque $erreur n'existe pas
par exemple
<?php
if (!isset($error() {
move_uploaded_file($ftmp,'./upload/'.$nom_final);
$error = 0;
}
pour virer les espaces un simplestr_replace devrait suffire ;)

pour info
la taille du fichier est données en octet.

sachant qu'un kilo octet contient 1024 octets tu demande que les fichiers fassent 0.098 k octets. c'est vraiment pas grand chose 100 octets tu devrait revoir la chose (100 ko c'est 102400 octets :) )

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

Belokan
Invité n'ayant pas de compte PHPfrance

14 juin 2012, 18:02

Merci moogli, je vais essayer de ce pas.

Concernant le poids, je l'ai mis volontairement à cette taille, de façon à avoir l'alerte lors de mes essais, ensuite je l'augmenterai en conséquence... :D

Je vais aussi essayer ton "str_replace", mais ne sais où le placer, mais vais bien trouver...

Merci pour ta réponse, plus que rapide !

Belokan
Invité n'ayant pas de compte PHPfrance

14 juin 2012, 18:13

moogli, serait-ce trop te demander, que de me donner ta soluce et la mise en place de ton code, dans mon code, car étant débutant, j'ai comme l'impression que je tourne en rond lorsque j'essaye d'insérer ta solution... :oops:

Merci d'avance ! :wink:

Belokan
Invité n'ayant pas de compte PHPfrance

15 juin 2012, 01:08

Je me réponds, si toutefois çà pouvait aider certains, donc voici la solution :

Code : Tout sélectionner

<? // Taille maximum $MAX_FILE_SIZE = 100; // Dossier de destination du fichier $folder = "upload/"; // Tableau array des différents types $allowed_types = array( "image/bmp", "image/gif", "image/pjpeg", "image/jpeg", "image/jpg", "image/png", "image/tiff", "application/postscript", "image/psd", "application/x-shockwave-flash", "multipart/x-zip", "application/msword", "application/excel", "application/vnd.ms-powerpoint", "application/pdf", "text/html", "text/css", "audio/aiff", "audio/mpeg", "audio/wav", "audio/x-ms-wma", "video/msvideo", "video/avi", "video/mpeg", "video/x-ms-wmv" ); // Variables récupérées par méthode POST du formulaire $fname = $_FILES['fichier']['name']; $ftype = $_FILES ['fichier']['type']; $fsize = $_FILES ['fichier']['size']; $ftmp = $_FILES ['fichier']['tmp_name']; $extension_upload = substr( strrchr($_FILES['fichier']['name'], '.') ,1); // Divers tests afin de savoir si : // Le format de fichier correspond à notre tableau array if(!in_array($ftype, $allowed_types)){$error = 1;} // La taille du fichier n'est pas dépassée else if($fsize > $MAX_FILE_SIZE){$error = 2;} else { // Si le fichier existe déjà if (file_exists('./upload/'.$fname)) { //Si le fichier existe, on rajoute dans son nom, la date et l'heure pour le différencier de la première (comme ça, on est sûr de ne pas avoir 2 images avec le même nom) $nom_final= preg_replace("`.$extension_upload`is",date("ldSFY-h.i.s-A").".$extension_upload",$fname); } else { $nom_final=$fname; //l'image n'existe pas on garde le même nom } //on déplace l'image dans le répertoire final if (move_uploaded_file($ftmp,'./upload/'.$nom_final)) {$error = 0;} else {$error = 3;} } // Messages avec apostrophe $m1 = ' à l\'emplacement suivant : '; $m2 = htmlspecialchars($m1); // Switch servant simplement à la gestion des erreures switch($error){ case'0': echo("<h3>Fichier correctement envoyé !</h3>"); echo ('<br/>'); echo ('<br/>'); //L'image apparait après validation avec son nom, son emplacement, son type et son poids echo '<img src="./upload/'.$nom_final.'" border="0" />'; echo "<br/><br/>Le nom dorigine du fichier est '" . $fname . "'.<br/>"; echo "Le fichier a été téléchargé avec succès" . $m2 . '/upload/'.$nom_final . "'<br/>"; echo "Le type du fichier est '" . $ftype . "'.<br/>"; echo "La taille du fichier est de '" . $fsize . " octets'.<br/>"; echo '<a href="javascript:history.back();" align="center">Retour</a>'; break; // Les messages des erreurs case'1': echo("Format de fichier incorrecte.<br/>"); echo '<a href="javascript:history.back();" align="center">Retour</a>'; break; case'2': echo("Fichier trop volumineux.<br/>"); echo '<a href="javascript:history.back();" align="center">Retour</a>'; break; case'3': echo("Erreur lors du déplacement du fichier.<br/>"); echo '<a href="javascript:history.back();" align="center">Retour</a>'; break; } ?>

Petit nouveau ! | 1 Messages

15 juin 2012, 01:23

Après plusieurs recherches, je ne trouve pas comment dire que le sujet est résolu, donc je le site dans ce dernier message :
SUJET [RÉSOLU]

ViPHP
AB
ViPHP | 5818 Messages

15 juin 2012, 05:05

L'est en panne le bouton résolu :(

Bon alors au passage puisque c'est un sujet sur l'upload je donne un lien vers un tuto qui parle de tout ça plus en détails. Et aussi une classe magique d'upload qui sait faire beaucoup de choses y compris la gestion des erreurs.

Belokan
Invité n'ayant pas de compte PHPfrance

15 juin 2012, 15:40

Bonjour AB,

un grand MERCI pour ton intervention qui m'est d'une grande aide précieuse !

PS : j'ai bien vu pour le bouton :D !!!