Erkennung der PHP-Dateigröße und Verarbeitung großer Datei-Uploads

伊谢尔伦
Freigeben: 2023-03-02 19:42:01
Original
3335 Leute haben es durchsucht

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">
Nach dem Login kopieren

, ein Eingabefeld:

<input name="userfile" type="file" />
Nach dem Login kopieren

und den Server Eine einzige Codezeile am Ende:

move_uploaded_file($_FILES[&#39;userfile&#39;][&#39;tmp_name&#39;], &#39;/var/www/uploads/&#39;. basename($_FILES[&#39;userfile&#39;][&#39;name&#39;]));
Nach dem Login kopieren

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
Nach dem Login kopieren

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();
Nach dem Login kopieren

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);
Nach dem Login kopieren

2. Erstellen Sie ein Objekt für Js-Zugriff, um die durch Flash erhaltenen Dateiinformationen zu platzieren

var s = {
    size:0,
    name:&#39;&#39;,
    type:&#39;&#39;
}
Nach dem Login kopieren

3. Erstellen die Methode zum Durchsuchen von Dateien

function browseFile():void {<br>
    fr.browse();<br>
}
Nach dem Login kopieren

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>
}
Nach dem Login kopieren

5. Machen Sie die Methode browseFile öffentlich, damit Js sie aufrufen kann

ExternalInterface.addCallback("browseFile", browseFile);
Nach dem Login kopieren

6. Übergeben Sie die erhaltenen Dateiinformationen an Js

ExternalInterface.call("onSelectFile",s);
Nach dem Login kopieren

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.


Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!