Validation de la taille de téléchargement des fichiers JavaScript


Réponses:


327

Oui , il existe une nouvelle fonctionnalité du W3C prise en charge par certains navigateurs modernes, l' API File . Il peut être utilisé à cette fin, et il est facile de tester s'il est pris en charge et de retomber (si nécessaire) sur un autre mécanisme s'il ne l'est pas.

Voici un exemple complet:

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Show File Data</title>
<style type='text/css'>
body {
    font-family: sans-serif;
}
</style>
<script type='text/javascript'>
function showFileSize() {
    var input, file;

    // (Can't use `typeof FileReader === "function"` because apparently
    // it comes back as "object" on some browsers. So just see if it's there
    // at all.)
    if (!window.FileReader) {
        bodyAppend("p", "The file API isn't supported on this browser yet.");
        return;
    }

    input = document.getElementById('fileinput');
    if (!input) {
        bodyAppend("p", "Um, couldn't find the fileinput element.");
    }
    else if (!input.files) {
        bodyAppend("p", "This browser doesn't seem to support the `files` property of file inputs.");
    }
    else if (!input.files[0]) {
        bodyAppend("p", "Please select a file before clicking 'Load'");
    }
    else {
        file = input.files[0];
        bodyAppend("p", "File " + file.name + " is " + file.size + " bytes in size");
    }
}

function bodyAppend(tagName, innerHTML) {
    var elm;

    elm = document.createElement(tagName);
    elm.innerHTML = innerHTML;
    document.body.appendChild(elm);
}
</script>
</head>
<body>
<form action='#' onsubmit="return false;">
<input type='file' id='fileinput'>
<input type='button' id='btnLoad' value='Load' onclick='showFileSize();'>
</form>
</body>
</html>

Et le voici en action. Essayez cela avec une version récente de Chrome ou Firefox.


Légèrement hors sujet, mais: Notez que la validation côté client ne remplace pas la validation côté serveur. La validation côté client vise uniquement à permettre une meilleure expérience utilisateur. Par exemple, si vous n'autorisez pas le téléchargement d'un fichier de plus de 5 Mo, vous pouvez utiliser la validation côté client pour vérifier que le fichier que l'utilisateur a choisi ne dépasse pas 5 Mo et lui donner un joli message convivial s'il l'est. (ils ne passent donc pas tout ce temps à télécharger uniquement pour obtenir le résultat sur le serveur), mais vous devez également appliquer cette limite au serveur, car toutes les limites côté client (et autres validations) peuvent être contournées.


12
+1 pour "toutes les limites côté client (et autres validations) peuvent être contournées". Cela est tout aussi vrai pour les applications frontales de base de données "natives" / "compilées". Et ne mettez pas les mots de passe d'accès à la base de données dans votre code compilé, pas même "cryptés" (avec un mot de passe qui est aussi dans le code - venez de le voir récemment).
masterxilo

118

Utilisation de jquery:

<form action="upload" enctype="multipart/form-data" method="post">

    Upload image:
    <input id="image-file" type="file" name="file" />
    <input type="submit" value="Upload" />

    <script type="text/javascript">
        $('#image-file').bind('change', function() {
            alert('This file size is: ' + this.files[0].size/1024/1024 + "MB");
        });
    </script>

</form>

2
@ipd, une chance de repli IE8? (Je me déteste même pour avoir mentionné IE)
Asher

2
Celui-ci fonctionne bien mais fonctionne-t-il également pour plusieurs fichiers?
Ingus

4
Cela devrait être le MiBcas si vous calculez à la base de 1024.
slartidan

69

Fonctionne pour l'élément de fichier dynamique et statique

Solution Javascript uniquement

function ValidateSize(file) {
        var FileSize = file.files[0].size / 1024 / 1024; // in MB
        if (FileSize > 2) {
            alert('File size exceeds 2 MB');
           // $(file).val(''); //for clearing with Jquery
        } else {

        }
    }
 <input onchange="ValidateSize(this)" type="file">


1
Bonne réponse. J'avais le même problème mais votre solution a fonctionné pour moi :)
Dipankar Das

1
NB OP a modifié le message afin que le code soit maintenant correct, en utilisant la sizepropriété
UsAndRufus

1
Merci pour la réponse, je faisais presque la même chose mais avec un seul changement. $(obj).files[0].size/1024/1024; Mais changé enobj.files[0].size/1024/1024;
shakir Baba

Existe-t-il un moyen de l'étendre pour la validation de la largeur et de la hauteur? (en laissant un "fichier" comme point de départ et en supposant qu'il se réfère à une image)
jlmontesdeoca

@jlmontesdeoca Je pense que vous pourriez lire le fichier à l'aide de canvas et obtenir sa hauteur et sa largeur ici même.
Arun Prasad ES

14

Non Oui, en utilisant l'API File dans les navigateurs plus récents. Voir la réponse de TJ pour plus de détails.

Si vous devez également prendre en charge les navigateurs plus anciens, vous devrez utiliser un programme de téléchargement Flash tel que SWFUpload ou Uploadify pour ce faire.

La démonstration des fonctionnalités de SWFUpload montre comment le file_size_limitparamètre fonctionne.

Notez que cela (évidemment) a besoin de Flash, plus la façon dont cela fonctionne est un peu différente des formulaires de téléchargement normaux.


14

C'est assez simple.

            var oFile = document.getElementById("fileUpload").files[0]; // <input type="file" id="fileUpload" accept=".jpg,.png,.gif,.jpeg"/>

            if (oFile.size > 2097152) // 2 mb for bytes.
            {
                alert("File size must under 2mb!");
                return;
            }

Meilleure réponse. doux et simple ... :)
A. Sinha

12

Si vous utilisez jQuery Validation, vous pouvez écrire quelque chose comme ceci:

$.validator.addMethod(
    "maxfilesize",
    function (value, element) {
        if (this.optional(element) || ! element.files || ! element.files[0]) {
            return true;
        } else {
            return element.files[0].size <= 1024 * 1024 * 2;
        }
    },
    'The file size can not exceed 2MB.'
);

4

J'ai fait quelque chose comme ça:

$('#image-file').on('change', function() {
 var numb = $(this)[0].files[0].size/1024/1024;
numb = numb.toFixed(2);
if(numb > 2){
alert('to big, maximum is 2MB. You file size is: ' + numb +' MB');
} else {
alert('it okey, your file has ' + numb + 'MB')
}
        });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<input type="file" id="image-file">


Cela dit javascript, JQuery n'est pas dans les balises
Hello234

3

J'utilise une fonction Javascript principale que j'avais trouvée sur le site Mozilla Developer Network https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications , ainsi qu'une autre fonction avec AJAX et modifiée en fonction de mes besoins. Il reçoit un identifiant d'élément de document concernant l'endroit dans mon code html où je veux écrire la taille du fichier.

<Javascript>

function updateSize(elementId) {
    var nBytes = 0,
    oFiles = document.getElementById(elementId).files,
    nFiles = oFiles.length;

    for (var nFileId = 0; nFileId < nFiles; nFileId++) {
        nBytes += oFiles[nFileId].size;
    }
    var sOutput = nBytes + " bytes";
    // optional code for multiples approximation
    for (var aMultiples = ["K", "M", "G", "T", "P", "E", "Z", "Y"], nMultiple = 0, nApprox = nBytes / 1024; nApprox > 1; nApprox /= 1024, nMultiple++) {
        sOutput = " (" + nApprox.toFixed(3) + aMultiples[nMultiple] + ")";
    }

    return sOutput;
}
</Javascript>

<HTML>
<input type="file" id="inputFileUpload" onchange="uploadFuncWithAJAX(this.value);" size="25">
</HTML>

<Javascript with XMLHttpRequest>
document.getElementById('spanFileSizeText').innerHTML=updateSize("inputFileUpload");
</XMLHttpRequest>

À votre santé


3

Même si la question est répondue, je voulais poster ma réponse. Pourrait être utile aux futurs téléspectateurs.Vous pouvez l'utiliser comme dans le code suivant.

<input type="file" id="fileinput" />
<script type="text/javascript">
  function readSingleFile(evt) {
    //Retrieve the first (and only!) File from the FileList object
    var f = evt.target.files[0]; 
    if (f) {
      var r = new FileReader();
      r.onload = function(e) { 
          var contents = e.target.result;
        alert( "Got the file.n" 
              +"name: " + f.name + "n"
              +"type: " + f.type + "n"
              +"size: " + f.size + " bytesn"
              + "starts with: " + contents.substr(1, contents.indexOf("n"))
        ); 
        if(f.size > 5242880) {
               alert('File size Greater then 5MB!');
                }


      }
      r.readAsText(f);
    } else { 
      alert("Failed to load file");
    }
  }

3

L'exemple JQuery fourni dans ce fil était extrêmement obsolète, et google n'était pas du tout utile alors voici ma révision:

 <script type="text/javascript">
        $('#image-file').on('change', function() {
            console.log($(this)[0].files[0].name+' file size is: ' + $(this)[0].files[0].size/1024/1024 + 'Mb');
        });
    </script>

1

Vous pouvez essayer ce fineuploader

Cela fonctionne bien sous IE6 (et supérieur), Chrome ou Firefox


3
Fine Uploader n'est pas en mesure de valider la taille du fichier dans IE9 et les versions antérieures car la prise en charge de l'API de fichiers n'est pas prise en charge. IE10 est la première version d'Internet Explorer qui prend en charge l'API de fichiers.
Ray Nicholus

-2

Si vous définissez le «Mode Document» sur «Standards», vous pouvez utiliser la méthode simple «taille» javascript pour obtenir la taille du fichier téléchargé.

Réglez le «Mode document» sur «Normes»:

<meta http-equiv="X-UA-Compatible" content="IE=Edge">

Ensuite, utilisez la méthode javascript 'size' pour obtenir la taille du fichier téléchargé:

<script type="text/javascript">
    var uploadedFile = document.getElementById('imageUpload');
    var fileSize = uploadedFile.files[0].size;
    alert(fileSize); 
</script>

Ça marche pour moi.


1
Cela ne fonctionnera pas dans IE9 ou une version antérieure, peu importe les balises META que vous ajoutez.
Ray Nicholus
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.