Maison  >  Article  >  développement back-end  >  Détection et traitement du téléchargement de fichiers PHP

Détection et traitement du téléchargement de fichiers PHP

墨辰丷
墨辰丷original
2018-06-05 16:04:454170parcourir

Cet article présente principalement la détection et le traitement du téléchargement de fichiers PHP. Les amis intéressés peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

La méthode de saisie pour le téléchargement est-elle si mauvaise ? Bien sûr que non. Lorsque l'upload de fichiers n'est pas volumineux, cela reste très simple et fiable. En PHP, nous n'avons besoin que d'un formulaire composite :

Le code est le suivant :

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

Une zone de saisie :

Le code est le suivant :

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

et une ligne de code côté serveur :

Le code est le suivant :

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

pour réaliser l'intégralité du processus de téléchargement.
Mais à mesure que le fichier grandit, les défauts du téléchargement du formulaire seront révélés. En particulier, la simple idée d’obtenir une taille de fichier minimale pour éviter les téléchargements de fichiers trop volumineux est devenue si difficile. Allons-y un par un :
Passer MAX_FILE_SIZEMAX_FILE_SIZE Le champ caché (en octets) doit être placé avant le champ de saisie du fichier, et sa valeur est la taille maximale du reçu déposer. Ceci est une recommandation pour les navigateurs, PHP le vérifiera également. Ce paramètre peut être facilement contourné du côté du navigateur, alors ne vous attendez pas à utiliser cette fonctionnalité pour bloquer des fichiers volumineux. En fait, la taille maximale du fichier de téléchargement dans les paramètres PHP n'expirera pas. Mais il est préférable d'ajouter cet élément au formulaire, car cela peut éviter aux utilisateurs de passer du temps à attendre que des fichiers volumineux soient téléchargés et de constater que le fichier est trop volumineux et que le téléchargement échoue.
Évidemment, les développeurs PHP ont également envisagé le problème des téléchargements de fichiers volumineux, mais comme le dit le manuel, MAX_FILE_SIZE n'est qu'une suggestion pour les navigateurs. En fait, tous les navigateurs grand public n'ont pas adopté cette suggestion jusqu'à présent, donc utilisez MAX_FILE_SIZE pour limiter la taille. la taille du fichier est comme une décoration et n’est pas réalisable.
Par le côté serveurÉtant donné que MAX_FILE_SIZE n'est pas valide, l'utilisateur peut télécharger le fichier sur le serveur, et le côté serveur détermine le fichier téléchargé par l'utilisateur via $_FILES[' userfile']['size'] taille du fichier, puis décidez si vous souhaitez accepter le téléchargement et renvoyer les informations. En excluant pour le moment la charge sur le serveur et un éventuel sabotage malveillant, cette solution ne ressemble à rien de plus qu'à un gaspillage de bande passante, et elle empêche également les utilisateurs de télécharger des fichiers.
Mais ce n'est pas réalisable. Le téléchargement de fichiers PHP est affecté par les paramètres suivants dans php.ini :

  • post_max_size

  • upload_max_filesize

  • max_execution_time

  • memory_limit

Bien que la méthode de réglage soit expliquée en détail dans le manuel, donc cette méthode n'est toujours pas réalisable car lorsque le script d'exécution PHP dépasse la limite mémoire, toutes les données POST seront perdues et aucune erreur ne sera signalée !
Imaginez que l'utilisateur remplisse un formulaire extrêmement long et le télécharge avec un fichier qui dépasse la limite de mémoire. Après un long temps d'attente, il découvre que ce qu'il attend est un autre formulaire vierge. expérience. De plus, des dizaines de Mo de trafic serveur ne sont utilisés que pour détecter la taille des fichiers, ce qui n'est pas autorisé dans l'environnement réseau actuel.
Grâce à JavascriptJavascript est basé sur le navigateur. Bien que JS puisse effectuer de nombreuses tâches apparemment impossibles, JS ne peut pas faire des choses que le navigateur ne peut pas faire. Des lacunes inhérentes condamnent ce travail au seul Javascript. Cependant, certaines méthodes IE Only existent toujours, à titre de référence uniquement.
Grâce à FlashLa classe FileReference de Flash fournit un ensemble relativement complet de méthodes de traitement de fichiers. La plupart des téléchargements de fichiers volumineux utilisent désormais également des solutions basées sur Flash. Si Flash est utilisé pour interagir avec Js, le client peut-il détecter la taille du fichier ? La réponse est oui.
Instanciez d’abord la classe FileReference dans le fichier flash.

var fr = new FileReference();

Sur la base de cette classe, vous pouvez utiliser les événements de navigation dans les fichiers et SelectFile fournis par Flash pour remplacer les événements du navigateur. Nous avons besoin de :
1. Bind SelectFile

fr.addEventListener(Event.SELECT, onSelectFile);

2. Créer un objet pour l'accès Js pour placer les informations du fichier obtenues par flash

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

3. Créer une méthode de navigation dans les fichiers

function browseFile():void {<br>
 fr.browse();<br>
}

4 Lorsque l'événement SelectFile est déclenché, transmettez les informations sur le fichier

function onSelectFile(e:Event):void {<br>
 s.size = fr.size;<br>
 s.name = fr.name;<br>
 s.type = fr.type;<br>
}

<.>5. Rendre la méthode BrowseFile publique pour que Js puisse l'appeler

ExternalInterface.addCallback("browseFile", browseFile);

6. Transmettez les informations de fichier obtenues à 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 输入输出流详解及实例分析

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn