Heim > Artikel > Backend-Entwicklung > Erkennung der PHP-Dateigröße und Verarbeitung großer Datei-Uploads
Aufgrund der Sicherheitsprobleme, die sowohl lokale als auch serverbezogene Aspekte betreffen, war das Hochladen von Auslagerungsdateien basierend auf dem Eingabetyp „Datei“ schon immer in einer schwierigen Lage. Einerseits möchten Benutzer nicht, dass ihre Privatsphäre preisgegeben wird, sodass der Browser keine wirksamen Urteile über die vom Benutzer beim Hochladen ausgewählten Dateien fällen kann. Andererseits hofft das System aus Gründen der serverseitigen Sicherheit und zur Reduzierung der Übertragungslast, illegale Dateien abzulehnen, bevor Benutzer mit dem Hochladen beginnen.
Im Laufe der Zeit ist das Hochladen auf der Grundlage der ursprünglichen Eingabemethode zu einem alten Problem geworden, das Netzwerkspeicher-Websites vermeiden, und es sind auch alle möglichen seltsamen Plug-Ins und Upload-Clients entstanden.
Ist die Eingabemethode beim Hochladen so schlecht? Natürlich nicht. Wenn das Hochladen von Dateien nicht groß ist, ist es dennoch sehr einfach und zuverlässig. In PHP benötigen wir nur ein zusammengesetztes Formular:
<form enctype="multipart/form-data" action="__URL__" method="POST">
, ein Eingabefeld:
<input name="userfile" type="file" />
und den Server Eine einzige Codezeile am Ende:
move_uploaded_file($_FILES['userfile']['tmp_name'], '/var/www/uploads/'. basename($_FILES['userfile']['name']));
kann den gesamten Upload-Prozess realisieren.
Aber wenn die Datei wächst, werden die Mängel beim Formular-Upload sichtbar. Insbesondere die einfache Idee, eine Mindestdateigröße festzulegen, um das Hochladen übermäßig großer Dateien zu verhindern, ist so schwierig geworden. Gehen wir sie einzeln durch:
Übergeben Sie MAX_FILE_SIZE
MAX_FILE_SIZE Das versteckte Feld (in Bytes) muss vor dem Dateieingabefeld platziert werden und sein Wert ist die maximale Größe der empfangenen Datei . Dies ist eine Empfehlung für Browser, PHP prüft dies auch. Diese Einstellung kann browserseitig einfach umgangen werden. Erwarten Sie also nicht, diese Funktion zum Blockieren großer Dateien zu verwenden. Tatsächlich läuft die maximale Upload-Dateigröße in den PHP-Einstellungen nicht ab. Es ist jedoch besser, dieses Element dem Formular hinzuzufügen, da dadurch vermieden werden kann, dass Benutzer lange auf das Hochladen großer Dateien warten müssen und dann feststellen, dass die Datei zu groß ist und der Upload fehlgeschlagen ist.
Offensichtlich haben PHP-Entwickler auch das Problem des Hochladens großer Dateien berücksichtigt, aber wie im Handbuch steht, ist MAX_FILE_SIZE nur ein Vorschlag für Browser. Tatsächlich haben dies bisher nicht alle Mainstream-Browser übernommen Die Verwendung von MAX_FILE_SIZE zur Begrenzung der Dateigröße gleicht lediglich einer Dekoration und ist nicht machbar.
Über die Serverseite
Da MAX_FILE_SIZE ungültig ist, kann der Benutzer die Datei auf den Server hochladen. Die Serverseite verwendet $_FILES['userfile']['size'], um zu bestimmen Die Größe der vom Benutzer hochgeladenen Datei wird dann entschieden, ob der Upload akzeptiert wird, und die Informationen werden zurückgegeben. Wenn man die Belastung des Servers und mögliche böswillige Sabotage vorerst außer Acht lässt, klingt diese Lösung nach nichts weiter als einer Verschwendung von Bandbreite und schränkt Benutzer außerdem beim Hochladen von Dateien ein.
Das Hochladen von PHP-Dateien wird jedoch durch die folgenden Einstellungen in php.ini beeinflusst:
post_max_size upload_max_filesize max_execution_time memory_limit
Obwohl die Einstellungsmethode im Handbuch ausführlich erläutert wird, ist diese Methode ist immer noch nicht machbar, denn wenn das PHP-Ausführungsskript das Memory_Limit überschreitet, gehen alle POST-Daten verloren und es wird kein Fehler gemeldet!
Stellen Sie sich vor, der Benutzer füllt ein sehr langes Formular aus und lädt es zusammen mit einer Datei hoch, die das Speicherlimit überschreitet. Nach einer langen Wartezeit stellt er fest, dass er auf ein weiteres leeres Formular wartet Was für eine beeindruckende Benutzererfahrung. Darüber hinaus werden Dutzende MByte an Serververkehr nur zur Erkennung der Dateigröße verwendet, was in der aktuellen Netzwerkumgebung nicht zulässig ist.
Durch Javascript
Javascript basiert auf dem Browser. Obwohl JS viele scheinbar unmögliche Aufgaben erledigen kann, kann JS nicht Dinge tun, die der Browser nicht kann. Inhärente Mängel machen diese Arbeit allein auf Javascript zurückzuführen. Einige reine IE-Methoden sind jedoch weiterhin vorhanden und dienen nur als Referenz.
Über Flash
Die FileReference-Klasse von Flash bietet einen relativ umfassenden Satz an Dateiverarbeitungsmethoden. Mittlerweile verwenden die meisten großen Datei-Uploads auch Flash-basierte Lösungen. Kann der Client die Dateigröße erkennen, wenn Flash zur Interaktion mit Js verwendet wird? Die Antwort ist ja.
Instanziieren Sie zunächst die FileReference-Klasse in der Flash-Datei.
var fr = new FileReference();
Basierend auf dieser Klasse können Sie die von Flash bereitgestellten Ereignisse zum Durchsuchen von Dateien und zum Auswählen von Dateien verwenden, um Browserereignisse zu ersetzen. Wir benötigen:
1. Bind SelectFile
fr.addEventListener(Event.SELECT, onSelectFile);
2. Erstellen Sie ein Objekt für Js-Zugriff, um die durch Flash erhaltenen Dateiinformationen zu platzieren
var s = { size:0, name:'', type:'' }
3. Erstellen die Methode zum Durchsuchen von Dateien
function browseFile():void {<br> fr.browse();<br> }
4. Wenn das SelectFile-Ereignis ausgelöst wird, übergeben Sie die Dateiinformationen
function onSelectFile(e:Event):void {<br> s.size = fr.size;<br> s.name = fr.name;<br> s.type = fr.type;<br> }
5. Machen Sie die Methode browseFile öffentlich, damit Js sie aufrufen kann
ExternalInterface.addCallback("browseFile", browseFile);
6. Übergeben Sie die erhaltenen Dateiinformationen an Js
ExternalInterface.call("onSelectFile",s);
Jetzt können wir die von Flash über Js übergebenen Dateigrößeninformationen abrufen.
Fazit
Das Problem scheint bisher gelöst zu sein. Wir haben die Dateigröße erfolgreich überprüft, oder? Die abschließende Schlussfolgerung dieses Artikels lautet jedoch, dass eine Flash-basierte Überprüfung der Dateigröße immer noch nicht möglich ist.
Der einzige Zweck der Überprüfung der Dateigröße ist das Hochladen. In der Demo oben sehen Sie, dass der erfolgreich verifizierte Dateiname in einem Eingabefeld angezeigt wird. Denken Studierende, die mit dem Hochladen vertraut sind, nicht, dass etwas fehlt? Richtig, Sie können den Dateinamen nur über Flash abrufen, aber nicht den vollständigen Pfad der Datei. Der Dateipfad ist eine notwendige Voraussetzung für das Hochladen per Eingabe. Obwohl wir die Dateigröße durch Flash- und JS-Interaktion erfolgreich überprüfen können, können wir sie nur überprüfen. Wenn wir sie später hochladen möchten, können wir nur weiterhin Flash verwenden.
Es ist verständlich, dass die Flash-Entwicklung aus Sicherheitsgründen den vollständigen Pfad der Datei blockiert. Allerdings gibt es für das Hochladen von Dateien, insbesondere für die Dateiüberprüfungs-Upload-Lösung in der PHP-Umgebung, immer noch nicht die beste Lösung.
Natürlich gibt es viele Möglichkeiten, das auszugleichen:
Perl-basierte Projekte FileChucker, Verwenden Sie PHP, um einen wunderschönen Socket-Link direkt auf dem Server zu erstellen.
Aber ich hoffe, dass ich eines Tages eine rigorose und robuste Upload-Lösung sehen kann, die nur auf HTML-Basis implementiert werden kann. Ich hoffe, dass dieser Tag nicht allzu weit entfernt ist.
Der letzte ist dieser Code-Download.
Detaillierte Erläuterung der PHP-Datei-Upload-Größeneinstellung
Beim Hochladen von Dateien mit PHP sind Fehler beim Hochladen großer Dateien das häufigste Problem. Dabei handelt es sich um die PHP-Konfigurationsdatei - php.ini
In dieser Konfigurationsdatei gibt es mehrere Werte, die eng mit Datei-Uploads zusammenhängen:
file_uploads = on // Ob das System ist darf das Hochladen von Dateien unterstützen
upload_tmp_dir //Der Speicherpfad für temporäre Dateien, der unter Linux der Systemstandardpfad ist, muss unter Win32 angegeben werden
upload_max_filesize = 2m //Die maximale Größe für das Hochladen von Dateien zulässig
post_max_size = 2m //Beim Senden an PHP über die Post-Methode die maximale Datenkapazität, die PHP akzeptieren kann
Wenn die Größe der von Ihnen hochgeladenen Datei weniger als 8 m beträgt (normalerweise), dann können Sie die oben genannten Einstellungen ändern. Ihre Anfrage wird erfüllt.
Aber wenn es >8m ist, dann sollte zusätzlich zu den oben genannten Werten besonders auf die beiden anderen Werte geachtet werden:
max_execution_time = 30 //Die maximale Zeit für jedes Skript ausgeführt werden (php Beim Hochladen ist die Größe zu groß, es ist nur eine Frage der Zeit)
memory_limit = 8m //Der maximale Speicher, den jedes Skript verbrauchen kann
Versuchen Sie, diese zu ändern zwei Werte größer sein. Im Allgemeinen können dadurch die meisten Probleme gelöst werden.
Daraus lässt sich ableiten, dass die Größe der hochgeladenen Datei unendlich sein kann. Berücksichtigen Sie aber auch Ihre Netzwerksituation usw.