Vérifier la taille d'un fichier
Le
Pascale
Bonjour,
Dans un formulaire qui permet d'uploader du texte et des images, j'utilise
(depuis fort longtemps) <input type="hidden" name="MAX_FILE_SIZE"
value="50000">.
Ensuite, du côté PHP, je fais un certain nombre de contrôles pour m'assurer
que le fichier est bien un jpg et pas autre chose. En particulier :
$contenu1=getimagesize($_FILES['photo1']['tmp_name']);
$type1=$contenu1[2];
if ($type1!=2) { echo 'Erreur';}
Si le fichier téléchargé est trop lourd, getimagesize me renvoie une
erreur.
J'ai conscience que ce n'est pas très propre comme solution et que je
devrais spécifiquement vérifier la taille du fichier que la personne a
tenté de télécharger, d'autant que c'est l'erreur la plus courante commise
par les utilisateurs.
Le mieux est-il de vérifier tout bêtement la taille du fichier dans
$_FILES['photo1']['size'] ou vaut-il mieux vérifier le contenu de
$_FILES['photo1']['error'] ? Ou bien ?
--
Pascale
http://www.la-grille-verte.net
Dans un formulaire qui permet d'uploader du texte et des images, j'utilise
(depuis fort longtemps) <input type="hidden" name="MAX_FILE_SIZE"
value="50000">.
Ensuite, du côté PHP, je fais un certain nombre de contrôles pour m'assurer
que le fichier est bien un jpg et pas autre chose. En particulier :
$contenu1=getimagesize($_FILES['photo1']['tmp_name']);
$type1=$contenu1[2];
if ($type1!=2) { echo 'Erreur';}
Si le fichier téléchargé est trop lourd, getimagesize me renvoie une
erreur.
J'ai conscience que ce n'est pas très propre comme solution et que je
devrais spécifiquement vérifier la taille du fichier que la personne a
tenté de télécharger, d'autant que c'est l'erreur la plus courante commise
par les utilisateurs.
Le mieux est-il de vérifier tout bêtement la taille du fichier dans
$_FILES['photo1']['size'] ou vaut-il mieux vérifier le contenu de
$_FILES['photo1']['error'] ? Ou bien ?
--
Pascale
http://www.la-grille-verte.net

Poser une question


ça vaut ce que ça vaut, y'a probablement mieux, je ne suis pas spécialiste
du PHP
<?php
$phpmaxfilesize = ini_get('upload_max_filesize');
$sitemaxfilesize = 2097152;
/* non utilisé ici */
$uploaderror=array(UPLOAD_ERR_OK=>'Chargement correct',
UPLOAD_ERR_INI_SIZE=>'Fichier plus gros que le maximum autorisé sur
le serveur',
UPLOAD_ERR_FORM_SIZE=>'Le fichier téléchargé excède la taille
autorisée sur le site',
UPLOAD_ERR_PARTIAL=>'Le fichier n'a été que partiellement
téléchargé',
UPLOAD_ERR_NO_FILE=>'Aucun fichier n'a été téléchargé',
UPLOAD_ERR_NO_TMP_DIR=>'Un dossier temporaire est manquant',
UPLOAD_ERR_CANT_WRITE=>'Échec de l'écriture du fichier sur le
disque',
UPLOAD_ERR_EXTENSION=>'Autre erreur de chargement'
);
/* http://www.iana.org/assignments/media-types/ */
$applicationtype=array('application/justbecause0canbefaulty',
'application/msword',
'application/ogg',
'application/pdf',
'application/rtf',
'application/vnd.ms-excel',
'application/vnd.ms-powerpoint',
'application/vnd.ms-project',
'application/vnd.oasis.opendocument.chart',
'application/vnd.oasis.opendocument.graphics',
'application/vnd.oasis.opendocument.presentation',
'application/vnd.oasis.opendocument.spreadsheet',
'application/vnd.oasis.opendocument.text',
'application/vnd.oasis.opendocument.text-master',
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/x-compress',
'application/x-compressed',
'application/x-zip',
'application/x-zip-compressed',
'application/zip',
'audio/mpeg',
'audio/ogg',
'audio/vnd.rn-realaudio',
'audio/x-ms-wma',
'audio/x-wav',
'image/gif',
'image/jpeg',
'image/png',
'image/tiff',
'multipart/x-zip',
'text/plain',
'video/mp4',
'video/ogg',
'video/quicktime',
'video/x-flv',
'video/x-ms-wmv',
'video/x-msvideo'
);
$document = $_FILES['filetoupload']['name'];
$taille = $_FILES['filetoupload']['size'];
$tmp = $_FILES['filetoupload']['tmp_name'];
$type = $_FILES['filetoupload']['type'];
$ferror = $_FILES['filetoupload']['error'];
if (!empty($document) && (!array_search($type, $applicationtype) ||
($taille > $sitemaxfilesize)))
{
$taille = $taille / 1024;
echo " ".$taille." ko, de type ".$type." est trop gros ou de type non
autorisé.</p>n";
$erreur="1";
}
?>
--
Utilisant le client e-mail révolutionnaire d'Opera :
http://www.opera.com/mail/
À quoi te sert ce champ ?
Dans l'absolu, tu vas quand même utiliser getimagesize pour t'assurer
que le fichier est une image, donc ce n'est pas choquant comme usage.
La taille spécifiée dans $_FILES est celle donnée par le navigateur,
ce n'est donc pas une information fiable.
Avant mieux, il y a correct :p
Alors pourquoi encombrer l'exemple avec du code qui va faire couiner
PHP ? (les E_NOTICE dues aux clés mal spécifiées)
[snip]
Ça correspond à quoi ça ?
[snip]
[snip]
Plein de parenthèses inutiles.
Ton code ne s'assure pas que le fichier est bien du type que le
navigateur l'a affirmé (ce que PHP donne dans
$_FILES['filetoupload']['type']).
Gros trou de sécurité (XSS).
Bref, au moins ça t'aura permis de corriger ton code, que de donner
de mauvais conseils ;)
parcer que c'est du copier-coller d'un include, et donc je spécifie que ça
n'a pas d'utilité ICI, pour éviter au questionneur de chercher à quoi ça
sert
non, ça m'a permis de constater qu'il y a éventuellement des erreurs, mais
tu ne donnes aucune piste de correction, ni en quoi ce sont des erreurs.
je vois des critiques, mais aucune piste d'amélioration
pour le petit site dont je m'occupe, mon code, bien que non parfait, a
l'avantage d'être fonctionnel.
--
Utilisant le client e-mail révolutionnaire d'Opera :
http://www.opera.com/mail/
Merci pour ta réponse... tout ça est bien compliqué pour ma petite
cervelle, je vais voir ce que je peux en tirer.
Mais je n'ai pas fini de m'arracher les cheveux : le même programme avec
les mêmes tests derrière ne fonctionne pas pareil chez mon hébergeur actuel
et chez mon futur hébergeur canadien. Je m'explique :
J'ai pour l'instant une limite de taille d'image à 50 Ko, telle que définie
dans mon MAX_FILE_SIZE mentionné précédemment. Et bien, sur chez le nouvel
hébergeur (que je commence à regretter d'avoir choisi, le support est
catastrophiquement absent), pour qu'une photo passe, il faut qu'elle soit
nettement plus petite que 50 Ko : je ne sais pas exactement où se trouve la
limite, mais par exemple, une photo de 49,5 Ko passera sur le site actuel,
par contre, elle ne passera pas chez le nouvel hébergeur ! Je n'ai fait
aucune modification dans les programmes.
Au s'cours, si quelqu'un pouvait me sortir de cette histoire de fous...
--
Pascale
http://www.la-grille-verte.net