Heim  >  Artikel  >  Backend-Entwicklung  >  Erkennung und Verarbeitung von PHP-Datei-Uploads

Erkennung und Verarbeitung von PHP-Datei-Uploads

墨辰丷
墨辰丷Original
2018-06-05 16:04:454134Durchsuche

Dieser Artikel stellt hauptsächlich die Erkennung und Verarbeitung von PHP-Dateien vor. Ich hoffe, dass er für alle hilfreich ist.

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:

Der Code lautet wie folgt:

<form enctype="multipart/form-data" action="__URL__" method="POST">

Ein Eingabefeld:

Der Code lautet wie folgt:

<input name="userfile" type="file" />

und eine Codezeile auf der Serverseite:

Der Code lautet wie folgt:

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

, um das Ganze zu erreichen Upload-Prozess.
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_SIZEMAX_FILE_SIZE Das versteckte Feld (in Bytes) muss vor dem Dateieingabefeld platziert werden und sein Wert ist die maximale Größe von die empfangene Datei. Dies ist eine Empfehlung für Browser, PHP prüft dies auch. Diese Einstellung kann auf der Browserseite leicht 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 zum 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 fehlschlägt.
Offensichtlich haben PHP-Entwickler auch das Problem des Hochladens großer Dateien in Betracht gezogen, aber wie im Handbuch steht, ist MAX_FILE_SIZE nur ein Vorschlag für Browser. Tatsächlich haben noch nicht alle Mainstream-Browser diesen Vorschlag übernommen, daher wird MAX_FILE_SIZE zur Begrenzung verwendet Die Dateigröße dient nur einer Dekoration und ist nicht realisierbar.
Über die ServerseiteDa MAX_FILE_SIZE ungültig ist, kann der Benutzer die Datei auf den Server hochladen, und die Serverseite bestimmt die vom Benutzer hochgeladene Datei über $_FILES[' userfile']['size'] Dateigröße und entscheiden Sie dann, ob Sie den Upload akzeptieren und die Informationen zurückgeben möchten. Abgesehen von der Belastung des Servers und möglichen böswilligen Sabotageakten klingt diese Lösung vorerst 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, also 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 extrem 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 einen weiteren leeren Benutzer wartet Erfahrung. 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 JavascriptJavascript basiert auf dem Browser. Obwohl JS viele scheinbar unmögliche Aufgaben erledigen kann, kann JS nicht Dinge tun, die der Browser nicht kann. Vererbte Mängel führen dazu, dass diese Arbeit nicht allein mit Javascript erledigt werden kann. Einige reine IE-Methoden sind jedoch weiterhin vorhanden und dienen nur als Referenz.
Über FlashDie FileReference-Klasse von Flash bietet einen relativ umfassenden Satz an Dateiverarbeitungsmethoden. Die meisten großen Datei-Uploads verwenden mittlerweile 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 den Js-Zugriff, um die durch Flash erhaltenen Dateiinformationen zu platzieren

var s = {
 size:0,
 name:&#39;&#39;,
 type:&#39;&#39;
}

3. Dateisuchmethode erstellen

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 ist für Js öffentlich verfügbar, um

ExternalInterface.addCallback("browseFile", browseFile);

aufzurufen. 6. Übergeben Sie die erhaltenen Dateiinformationen an Js

ExternalInterface.call("onSelectFile",s);

现在我们已经可以通过Js获得由flash传递来的文件大小信息了,具体的实现可以参看Demo 。
结论
问题至此似乎已经得到解决了,我们已经成功的校验了文件大小不是么。但本文的最终结论是,基于Flash的文件大小校验,仍然不可行。
文件大小校验的唯一目的,是为了上传。在上面的Demo中可以看到校验成功的文件名会显示在一个输入框里。熟悉上传的同学不觉得少了什么吗?没错,通过 flash只能得到文件名,而无法得到文件的完整路径,而文件路径却是input方式上传的必要条件。所以虽然可以成功的通过Flash与Js交互校验文 件大小,但我们能做到的也仅仅只是校验而已,之后想要上传,唯有继续通过flash方式进行。
Flash开发出于安全考虑屏蔽了文件的完整路径这无可厚非,不过文件上传,尤其是PHP环境下的文件校验上传方案仍然没有得到最好的解决。
当然弥补的方法有很多:

基于Perl的项目 FileChucker , XUpload , Uber-Uploader基于Flash的项目 SWFUpload还有筒子用PHP直接 在服务器华丽的建立socket链接

但终究我希望有一天能看到仅基于HTML就能实现的严整健壮的上传方案,但愿这一天不会太远。
最后是本次的代码下载 。
php文件上传大小设置详解用php上传文件,问题最多的就是上传大体积文件时出现错误。 这就涉及到php的配置文件——php.ini
在此配置文件中,有这么几个值是跟文件上传有密切关系的:

  • file_uploads = on //是否允许系统支持文件上传

  • upload_tmp_dir //临时文件的存储路径,linux下为系统默认路径,win32下需要指定

  • upload_max_filesize = 2m //允许文件上传最大体积

  • post_max_size = 2m //通过post方法给php时,php所能接受的最大数据容量

如果你上传的文件体积在8m一下(通常情况),那修改以上设置就可以满足你的要求了。
但要>8m,那除了上面几个值,还要特别关注另外两个值了:

  • max_execution_time = 30 //每个script所执行的最大时间(php上传就时,体积大了,就是个时间问题)

  • memory_limit = 8m //每个script所能消耗的最大memory

试着把这两个值改大些。一般就可以解决大多数问题了。

就此推断,上传文件的体积是可以无穷大的。但还要考虑你的网络情况,等等。
在php.net上,有人说按照这个方法改了后,大于100m的文件还是会出错,不知道是不是PHP本身的问题了。

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

相关推荐:

PHP中基于sleep函数实现定时执行功能的方法

PHP 输出缓冲控制详解

php 输入输出流详解及实例分析

Das obige ist der detaillierte Inhalt vonErkennung und Verarbeitung von PHP-Datei-Uploads. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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