Vérifiez la taille du fichier avant de télécharger

J'utilise ce javascript que j'ai obtenu ici, et ça fonctionne parfaitement pour ce dont j'ai besoin.

var _validFileExtensions = [".jpg", ".jpeg"]; function File_Validator(theForm){ var arrInputs = theForm.getElementsByTagName("input"); for (var i = 0; i < arrInputs.length; i++) { var oInput = arrInputs[i]; if (oInput.type == "file") { var sFileName = oInput.value; var blnValid = false; for (var j = 0; j < _validFileExtensions.length; j++) { var sCurExtension = _validFileExtensions[j]; if (sFileName.substr(sFileName.length - sCurExtension.length, sCurExtension.length).toLowerCase() == sCurExtension.toLowerCase()) { blnValid = true; break; } } if (!blnValid) { alert("Invalid image file type!"); return false; } } } return true; } 

Maintenant, je me demandais si, en plus, je pourrais vérifier la taille du fichier et échouer si le fichier est supérieur à 500kb -> tous avant d'appuyer sur le bouton de soumettre / télécharger?

MODIFIER

Après avoir examiné ce que PHPMyCoder a suggéré, je finis par résoudre en utilisant ce code javascript:

 <script language='JavaScript'> function checkFileSize(inputFile) { var max = 3 * 512 * 512; // 786MB if (inputFile.files && inputFile.files[0].size > max) { alert("File too large."); // Do your thing to handle the error. inputFile.value = null; // Clear the field. } } </script> 

Cela vérifie la taille du fichier et alerte l'utilisateur avant de soumettre le formulaire.

Annulation de téléchargement côté client

Sur les navigateurs modernes (FF> = 3.6, Chrome> = 19.0, Opera> = 12.0 et buggy sur Safari), vous pouvez utiliser l' API de fichiers HTML5 . Lorsque la valeur d'une entrée de fichier change, cette API vous permettra de vérifier si la taille du fichier est conforme à vos besoins. Bien sûr, ceci, ainsi que MAX_FILE_SIZE , peut être falsifié, alors utilisez toujours la validation côté serveur.

 <form method="post" enctype="multipart/form-data" action="upload.php"> <input type="file" name="file" id="file" /> <input type="submit" name="submit" value="Submit" /> </form> <script> document.forms[0].addEventListener('submit', function( evt ) { var file = document.getElementById('file').files[0]; if(file && file.size < 10485760) { // 10 MB (this size is in bytes) //Submit form } else { //Prevent default and display error evt.preventDefault(); } }, false); </script> 

L'annulation du téléchargement côté serveur

Du côté du serveur, il est impossible d'empêcher un téléchargement de PHP car une fois que PHP a été invoqué, le téléchargement a déjà été effectué. Si vous essayez d'économiser de la bande passante, vous pouvez refuser les téléchargements du côté du serveur avec le paramètre ini upload_max_filesize . La difficulté avec cela est que cela s'applique à tous les téléchargements afin que vous deviez choisir quelque chose de libéral qui fonctionne pour tous vos téléchargements. L'utilisation de MAX_FILE_SIZE a été discutée dans d'autres réponses. Je suggère de lire le manuel à ce sujet . Sachez que cela, avec n'importe quel autre côté du client (y compris la vérification javascript), peut être falsifié, vous devriez toujours avoir la validation côté serveur (PHP).

Validation PHP

Du côté du serveur, vous devez valider que le fichier est dans les restrictions de taille (car tout ce qui excepte le paramètre INI pourrait être falsifié). Vous pouvez utiliser le tableau $_FILES pour connaître la taille du téléchargement. (Les documents sur le contenu de $_FILES se trouvent sous les documents MAX_FILE_SIZE )

Upload.php

 <?php if(isset($_FILES['file']) { if($_FILES['file']['size'] > 10485760) { //10 MB (size is also in bytes) // File too big } else { // File within size restrictions } } 

J'ai créé une version jQuery de la réponse de PhpMyCoder:

 $('form').submit(function( e ) { if(!($('#file')[0].files[0].size < 10485760 && get_extension($('#file').val()) == 'jpg')) { // 10 MB (this size is in bytes) //Prevent default and display error alert("File is wrong type or over 10Mb in size!"); e.preventDefault(); } }); function get_extension(filename) { return filename.split('.').pop().toLowerCase(); } 

L'utilisation de JavaScript dans un navigateur n'a généralement pas accès au système de fichiers local. C'est à l'extérieur du bac à sable. Je pense donc que la réponse est non.