Begrenzen Sie die Größe eines Datei-Uploads (HTML-Eingabeelement)

77

Ich möchte einfach die Größe einer Datei begrenzen, die ein Benutzer hochladen kann.

Ich dachte maxlength = 20000 = 20k, aber das scheint überhaupt nicht zu funktionieren.

Ich arbeite auf Rails, nicht auf PHP, dachte aber, es wäre viel einfacher, es clientseitig in HTML / CSS oder als letztes Mittel mit jQuery zu tun. Dies ist jedoch so grundlegend, dass es ein HTML-Tag geben muss, das mir fehlt oder das ich nicht kenne.

Ich möchte IE7 +, Chrome, FF3.6 + unterstützen. Ich nehme an, ich könnte bei Bedarf nur IE8 + unterstützen.

Vielen Dank.

Delphi
quelle
1
Es ist möglich. Bitte beziehen Sie sich auf diese Frage.
SandSK

Antworten:

97

Dies ist durchaus möglich. Verwenden Sie Javascript.

Ich benutze jQuery, um das Eingabeelement auszuwählen. Ich habe es mit einem On-Change-Ereignis eingerichtet.

$("#aFile_upload").on("change", function (e) {

    var count=1;
    var files = e.currentTarget.files; // puts all files into an array

    // call them as such; files[0].size will get you the file size of the 0th file
    for (var x in files) {

        var filesize = ((files[x].size/1024)/1024).toFixed(4); // MB

        if (files[x].name != "item" && typeof files[x].name != "undefined" && filesize <= 10) { 

            if (count > 1) {

                approvedHTML += ", "+files[x].name;
            }
            else {

                approvedHTML += files[x].name;
            }

            count++;
        }
    }
    $("#approvedFiles").val(approvedHTML);

});

Der obige Code speichert alle Dateinamen, die ich für würdig halte, auf der Übermittlungsseite zu bleiben, bevor die Übermittlung tatsächlich erfolgt. Ich füge die "genehmigten" Dateien mit jQuery zum Wert eines Eingabeelements hinzu, sodass ein Formular die Namen der Dateien sendet, die ich speichern möchte. Alle Dateien werden gesendet, jetzt müssen wir sie jedoch auf der Serverseite herausfiltern. Ich habe noch keinen Code dafür geschrieben, aber benutze deine Fantasie. Ich gehe davon aus, dass man dies durch eine for-Schleife erreichen und die vom Eingabefeld gesendeten Namen abgleichen und mit der Variablen $ _FILES (PHP Superglobal, sorry, ich kenne die Ruby-Dateivariable nicht) abgleichen kann.

Mein Punkt ist, dass Sie vor dem Einreichen nach Dateien suchen können. Ich mache das und gebe es dann an den Benutzer aus, bevor er das Formular absendet, um ihn wissen zu lassen, was er auf meine Site hochlädt. Alles, was die Kriterien nicht erfüllt, wird dem Benutzer nicht wieder angezeigt. Daher sollte er wissen, dass zu große Dateien nicht gespeichert werden. Dies sollte in allen Browsern funktionieren, da ich kein FormData-Objekt verwende.

mark.inman
quelle
21
Sie können es nicht clientseitig tun und erwarten, dass es immer funktioniert. Wenn es auch auf der Serverseite wichtig ist, dies zu überprüfen, verwenden die Benutzer geänderte Kopien des Formulars (oder andere clientseitige Mittel), um übergroße Dateien hochzuladen. Serverseitige Überprüfungen sind wie eine Sperre, clientseitige Überprüfungen sind wie eine Haftnotiz mit der Aufschrift "draußen bleiben". Schließen Sie zuerst die Tür ab und bringen Sie dann das Schild "draußen bleiben" an.
user340140
2
@ user340140 Solange der Client Javascript unterstützt, können Sie. Wenn der Client nicht einfach angibt, dass für die Site Javascript aktiviert sein muss. Javascript hat einen Dateireader, der im Wesentlichen nicht ausgetrickst werden kann. Er liest Stück für Stück, sodass Sie sich keine Sorgen machen müssen, eine kleine Datei zu erhalten, die heimlich eine andere Größe hat. Die Serverseite ist die bevorzugte "sichere" Methode, aber ich sehe nicht, dass Javascript nicht so sicher ist, wenn es um die Dateigröße geht.
Mark.inman
6
Denn wie User340140 sagte Javascript kann leicht geändert werden, was auch immer Sie tun. Sie können dies zusätzlich zur serverseitigen Überprüfung der Benutzerfreundlichkeit tun, aber Sie können es nicht mit clientseitigem Javascript sichern.
Sinan Samet
Es ist nicht möglich, nur JavaScript-Code (clientseitig) zu verwenden, da dieser leicht umgangen werden kann. Eine serverseitige Logik wird benötigt.
Akshay Anurag
76
var uploadField = document.getElementById("file");

uploadField.onchange = function() {
    if(this.files[0].size > 2097152){
       alert("File is too big!");
       this.value = "";
    };
};

Dieses Beispiel sollte gut funktionieren. Ich habe es für ungefähr 2 MB eingerichtet, 1 MB in Bytes ist 1.048.576, sodass Sie es mit dem von Ihnen benötigten Limit multiplizieren können.

Hier ist das jsfiddle-Beispiel für mehr Klarheit:
https://jsfiddle.net/7bjfr/808/

Haseeb Rehman
quelle
Es ist nicht möglich, nur JavaScript-Code (clientseitig) zu verwenden, da dieser leicht umgangen werden kann. Eine serverseitige Logik wird benötigt.
Akshay Anurag
6
@AkshayAnurag clientseitige Validierung verhindert Zeitverschwendung des Clients und Bandbreite des Servers. Es geht nicht um Sicherheit, sondern um UX
Arash Moosapour
Sicherheit ist nie wichtiger als UX. Wenn es wichtig ist, die Dateigröße zu begrenzen, tun Sie dies im Back-End. Wenn Sie es wirklich im Frontend tun möchten, gibt es bessere Möglichkeiten, dies zu tun.
Akshay Anurag
12
@AkshayAnurag Sie können die Bildgröße im Backend erst überprüfen, nachdem das gesamte Bild hochgeladen wurde. Wenn es sich um ein großes Bild handelt, sagen wir, 16 MB und der Client haben eine langsame Verbindung, da der Benutzer die gesamte Zeit warten muss, in der das Bild hochgeladen wird, um eine zu erhalten Fehler am Ende. Um so etwas zu verhindern, benötigen Sie eine Art Validierung im Front-End. Bitte lassen Sie mich wissen, wenn ich falsch liege oder etwas vermisse oder wenn Sie etwas haben, um dies zu verhindern.
Haseeb Rehman
27

Sie können es nicht clientseitig tun. Sie müssen es auf dem Server tun.

Edit: Diese Antwort ist veraltet!

Zum Zeitpunkt dieser Bearbeitung wird die HTML-Datei-API jetzt in allen gängigen Browsern unterstützt .

Ich würde ein Update mit Lösung bereitstellen, aber @ mark.inman.winning hat es bereits getan .

Beachten Sie, dass Sie die Validierung auf dem Client auch dann auf dem Server durchführen sollten , wenn sie jetzt möglich ist . Alle clientseitigen Validierungen können umgangen werden.

Ortiga
quelle
2
Ja, das ist momentan unmöglich. Es gibt einige Entwürfe einer neuen Datei-API in HTML5, aber derzeit wird sie von keinem Browser vollständig unterstützt.
Ortiga
2
Siehe: cs.tut.fi/~jkorpela/forms/file.html , "Festlegen von Einschränkungen für die Dateigröße", warum es sinnlos ist, dies clientseitig zu versuchen.
Magma
Sie haben auf einem Besuchercomputer keinen Zugriff auf das lokale Dateisystem. Das Beste, auf das Sie hoffen können, ist, dass Apache die Dateigröße begrenzt und den Upload stoppt, wenn er zu groß ist.
Brent Friar
Es ist dumm, es auf der Client-Seite zu tun - es sei denn, Sie möchten es nur für den Benutzer bequem machen. "Sie müssen die Serverseite validieren. Sie können die Clientseite validieren."
d -_- b
2
Interessant ... das scheint zu funktionieren: plupload.com . Das einzige Problem ist, dass IE8 ohne Flash-, Silverlight-, Zahnrad- usw. Plugins anscheinend standardmäßig HTML4 verwendet.
Delphi
7

const input = document.getElementById('input')

input.addEventListener('change', (event) => {
  const target = event.target
  	if (target.files && target.files[0]) {

      /*Maximum allowed size in bytes
        5MB Example
        Change first operand(multiplier) for your needs*/
      const maxAllowedSize = 5 * 1024 * 1024;
      if (target.files[0].size > maxAllowedSize) {
      	// Here you can ask your users to load correct file
       	target.value = ''
      }
  }
})
<input type="file" id="input" />

Wenn Sie den Dateityp überprüfen müssen , schreiben Sie unten in die Kommentare und ich werde meine Lösung teilen.

(Spoiler: acceptAttribut ist keine kugelsichere Lösung)

Yury Lavrukhin
quelle
2

Beispiel für eine Videodatei (HTML + Javascript):

function upload_check()
{
    var upl = document.getElementById("file_id");
    var max = document.getElementById("max_id").value;

    if(upl.files[0].size > max)
    {
       alert("File too big!");
       upl.value = "";
    }
};
<form action="some_script" method="post" enctype="multipart/form-data">
    <input id="max_id" type="hidden" name="MAX_FILE_SIZE" value="250000000" />
    <input onchange="upload_check()" id="file_id" type="file" name="file_name" accept="video/*" />
    <input type="submit" value="Upload"/>
</form>

Fanda
quelle
1

const input = document.getElementById('input')

input.addEventListener('change', (event) => {
  const target = event.target
  	if (target.files && target.files[0]) {

      /*Maximum allowed size in bytes
        5MB Example
        Change first operand(multiplier) for your needs*/
      const maxAllowedSize = 5 * 1024 * 1024;
      if (target.files[0].size > maxAllowedSize) {
      	// Here you can ask your users to load correct file
       	target.value = ''
      }
  }
})
<input type="file" id="input" />

Schlankes Brötchen
quelle
-1
<script type="text/javascript">
    $(document).ready(function () {

        var uploadField = document.getElementById("file");

        uploadField.onchange = function () {
            if (this.files[0].size > 300000) {
                this.value = "";
                swal({
                    title: 'File is larger than 300 KB !!',
                    text: 'Please Select a file smaller than 300 KB',
                    type: 'error',
                    timer: 4000,
                    onOpen: () => {
                        swal.showLoading()
                        timerInterval = setInterval(() => {
                            swal.getContent().querySelector('strong')
                                .textContent = swal.getTimerLeft()
                        }, 100)
                    },
                    onClose: () => {
                        clearInterval(timerInterval)

                    }
                }).then((result) => {
                    if (
                        // Read more about handling dismissals
                        result.dismiss === swal.DismissReason.timer


                    ) {

                        console.log('I was closed by the timer')
                    }
                });

            };
        };



    });
</script>
Ashadul Hoque Jahin
quelle
1
Bitte versuchen Sie, Ihrem Code einige Erklärungen hinzuzufügen.
Partho63
Es ist nicht möglich, nur JavaScript-Code (clientseitig) zu verwenden, da dieser leicht umgangen werden kann. Eine serverseitige Logik wird benötigt.
Akshay Anurag