Implémentation PHP des exemples de téléchargement et de téléchargement de fichiers, explication détaillée

王林
Libérer: 2023-04-07 10:54:02
avant
3013 Les gens l'ont consulté

1. Principe et configuration du téléchargement

1.1 Principe

Téléchargez les fichiers client sur le serveur, puis déplacez les fichiers du serveur (fichiers temporaires) vers l'emplacement spécifié. L'annuaire suffit.

1.2 Configuration client

requise : page de formulaire (sélectionner le fichier de téléchargement) ;

Plus précisément : la méthode d'envoi estPOST, ajoutez l'attributenctype="multipart/form-data", les deux sont indispensable (cependant, des avantages et des inconvénients coexistent, ici limite également la méthode de téléchargement et l'appel après le téléchargement du fichier, etc., qui seront discutés plus tard

    Insert title here 
请选择您要上传的文件:
Copier après la connexion

Le premier est la page de formulaire (veuillez ignorer le front-end émet automatiquement. . ), la clé est l'attribut form ; l'autre est l'utilisation de type="file" (reflétant la puissante expansion de php, etc.)

puis doAction.php

.

        
Copier après la connexion
.

Jetons d'abord un coup d'œil auxprint_r($_FILES)informations

Array ( [myFile] => Array ( [name] => 梁博_简历.doc [type] => application/msword [tmp_name] => D:\wamp\tmp\php1D78.tmp [error] => 0 [size] => 75776 ) )
Copier après la connexion

Donc, ce que vous obtenez est un tableau bidimensionnel. Comment l'utiliser, ce sont toutes des choses de base (en fait, j'aime réduire. la dimension puis l'utiliser);

C'est en gros quelque chose qui peut être compris d'un coup d'oeil, sans être verbeux, il y a deux points clés :tmp_namenom du fichier temporaireerrormessage d'erreur (nom de code; , vous pourrez l'utiliser plus tard);

Ensuite, jetez un œil à doAction ici. Dans la dernière partie, les informations sur l'erreur sont utilisées pour renvoyer l'utilisateur. Ce qui doit être expliqué, c'est pourquoi l'erreur est signalée et quoi. les informations d'erreur sont

1.3 À propos du rapport d'erreurs

--Cause du rapport d'erreur

Fondamentalement, elles dépassent ou ne sont pas conformes à la configuration du serveur pour télécharger des fichiers. Alors, quelles sont les configurations côté serveur ?

Considérez d'abord ce que nous utilisons pour télécharger POST, téléchargez

Recherchez donc ces éléments dans php.ini :

file_upload:On

upload_tmp_dir= - répertoire d'enregistrement des fichiers temporaires

upload_max_filesize= 2M

max_file_uploads=20——Le nombre maximum de fichiers autorisés à être téléchargés en une seule fois (notez la différence avec celui ci-dessus, n'y pensez pas s'il y a une taille)

post_max_size=8M—— La valeur maximale des données envoyées par courrier mode

Autres configurations associées

max_exectuion_time=-1 - temps d'exécution maximum pour éviter que le programme n'occupe les ressources du serveur

max_input_time=60

max_input_nesting_level=64 - Entrez la profondeur d'imbrication

memory_limit=128M - Utilisation maximale de la mémoire indépendante d'un seul thread

En bref, c'est tout à propos de la configuration des ressources.

--Numéro d'erreur

UPLOAD_ERR_OKValeur : 0 ; Aucune erreur ne s'est produite, le téléchargement du fichier a réussi >
Valeur : 1. ; Le fichier téléchargé dépasse la valeur de l'option upload_max_filesize dans php.iniUPLOAD_ERR_INI_SIZE
Valeur : 2 ; La taille du fichier téléchargé dépasse la valeur spécifiée par l'option MAX_FILE_SIZE dans le formulaire HTML. > Valeur : 3 ; Seule une partie du fichier a été téléchargéeUPLOAD_ERR_FORM_SIZE
Valeur : 4 ;UPLOAD_ERR_PARTIAL
UPLOAD_ERR_NO_FILERemarque : Ce message d'erreur concerne les informations téléchargées lors de la première étape, c'est-à-dire lors du téléchargement vers un dossier temporaire, et non lors du déplacement ou de la copie.

2. Restrictions liées au téléchargement

2.1 Restrictions du client

请选择您要上传的文件:
Copier après la connexion

Ici, les attributs d'entrée sont utilisés pour contrôler la taille et le type. des fichiers téléchargés, il y a des restrictions, mais mon sentiment personnel est le suivant : premièrement, le code html est "visible" deuxièmement, cela ne fonctionne souvent pas (je n'ai pas trouvé la raison, mais à cause de la première, je veux aussi ; pour y renoncer, il suffit de le savoir.

2.2 Les restrictions côté serveur

limitent principalement la taille et le type, et puis il y a la méthode d'encapsulation de la

fonction <. >
$maxsize) { exit("上传文件过大!"); } if (!in_array($ext, $allowExt)) { exit("非法文件类型"); } if (!is_uploaded_file($tmp_name)) { exit("上传方式有误,请使用post方式"); } if (@move_uploaded_file($tmp_name, $uniName)) {//@错误抑制符,不让用户看到警告 echo "文件".$filename."上传成功!"; }else{ echo "文件".$filename."上传失败!"; } //判断是否为真实图片(防止伪装成图片的病毒一类的 if (!getimagesize($tmp_name)) {//getimagesize真实返回数组,否则返回false exit("不是真正的图片类型"); } }else{ switch ($error){ case 1: echo "超过了上传文件的最大值,请上传2M以下文件"; break; case 2: echo "上传文件过多,请一次上传20个及以下文件!"; break; case 3: echo "文件并未完全上传,请再次尝试!"; break; case 4: echo "未选择上传文件!"; break; case 7: echo "没有临时文件夹"; break; } }
Copier après la connexion

pour appeler

$maxSize) { exit("上传文件过大!"); } if (!in_array($ext, $allowExt)) { exit("非法文件类型"); } if (!is_uploaded_file($tmp_name)) { exit("上传方式有误,请使用post方式"); } //判断是否为真实图片(防止伪装成图片的病毒一类的 if (!getimagesize($tmp_name)) {//getimagesize真实返回数组,否则返回false exit("不是真正的图片类型"); } if (@move_uploaded_file($tmp_name, $destination)) {//@错误抑制符,不让用户看到警告 echo "文件".$filename."上传成功!"; }else{ echo "文件".$filename."上传失败!"; } }else{ switch ($error){ case 1: echo "超过了上传文件的最大值,请上传2M以下文件"; break; case 2: echo "上传文件过多,请一次上传20个及以下文件!"; break; case 3: echo "文件并未完全上传,请再次尝试!"; break; case 4: echo "未选择上传文件!"; break; case 7: echo "没有临时文件夹"; break; } } return $destination; }
Copier après la connexion

3. Implémentation du téléchargement de plusieurs fichiers

3.1 Utiliser l'encapsulation de fichier unique


        
Copier après la connexion
    Insert title here 
请选择您要上传的文件:
请选择您要上传的文件:
请选择您要上传的文件:
请选择您要上传的文件:
Copier après la connexion

L'idée ici peut être trouvé à partir de. Lorsque vous l'imprimerez, vous verrez qu'il s'agit d'un tableau à 2 dimensions, c'est très simple, il suffit de le parcourir et de l'utiliser

Changez la définition de la fonction ci-dessus et donnez-en quelques-unes ! valeurs par défaut


        
Copier après la connexion

De cette façon, c'est simple, mais il y a quelques problèmes Problème

print_r($_FILES)Il n'y a aucun problème pour télécharger 4 images normalement, mais si la sortie est activée dans la fonction, ce sera le cas. s'arrête immédiatement, empêchant le téléchargement d'autres images

Package de la version 3.2 mise à niveau

Destiné à encapsuler les téléchargements de fichiers multiples ou uniques

Écrivez d'abord un. fichier statique comme celui-ci

function uploadFile($fileInfo,$path="uploads",$allowExt=array('jpeg','jpg','png','tif'),$maxSize=10485760){
Copier après la connexion

Print $_FILES

    Insert title here 
请选择您要上传的文件:
请选择您要上传的文件:
请选择您要上传的文件:
请选择您要上传的文件:
Copier après la connexion

Vous pouvez obtenir un tableau tridimensionnel

C'est compliqué, mais les valeurs sont toutes ensemble, c'est donc très pratique pour nous d'obtenir les valeurs ! Obtenez d'abord les informations du fichier et transformez-les en un seul fichier d'informations de traitement

Array ( [myFile] => Array ( [name] => Array ( [0] => test32.png [1] => test32.png [2] => 333.png [3] => test41.png ) [type] => Array ( [0] => image/png [1] => image/png [2] => image/png [3] => image/png ) [tmp_name] => Array ( [0] => D:\wamp\tmp\php831C.tmp [1] => D:\wamp\tmp\php834C.tmp [2] => D:\wamp\tmp\php837C.tmp [3] => D:\wamp\tmp\php83BB.tmp ) [error] => Array ( [0] => 0 [1] => 0 [2] => 0 [3] => 0 ) [size] => Array ( [0] => 46174 [1] => 46174 [2] => 34196 [3] => 38514 ) ) )
Copier après la connexion

Ensuite, s'il y a une erreur de sortie comme avant, changez simplement la sortie ici. res

function getFiles(){ $i=0; foreach($_FILES as $file){ if(is_string($file['name'])){ //单文件判定 $files[$i]=$file; $i++; }elseif(is_array($file['name'])){ foreach($file['name'] as $key=>$val){ //我的天,这个$key用的diao $files[$i]['name']=$file['name'][$key]; $files[$i]['type']=$file['type'][$key]; $files[$i]['tmp_name']=$file['tmp_name'][$key]; $files[$i]['error']=$file['error'][$key]; $files[$i]['size']=$file['size'][$key]; $i++; } } } return $files; }
Copier après la connexion

Il encapsule deux petits

function uploadFile($fileInfo,$path='./uploads',$flag=true,$maxSize=1048576,$allowExt=array('jpeg','jpg','png','gif')){ //$flag=true; //$allowExt=array('jpeg','jpg','gif','png'); //$maxSize=1048576;//1M //判断错误号 $res=array(); if($fileInfo['error']===UPLOAD_ERR_OK){ //检测上传得到小 if($fileInfo['size']>$maxSize){ $res['mes']=$fileInfo['name'].'上传文件过大'; } $ext=getExt($fileInfo['name']); //检测上传文件的文件类型 if(!in_array($ext,$allowExt)){ $res['mes']=$fileInfo['name'].'非法文件类型'; } //检测是否是真实的图片类型 if($flag){ if(!getimagesize($fileInfo['tmp_name'])){ $res['mes']=$fileInfo['name'].'不是真实图片类型'; } } //检测文件是否是通过HTTP POST上传上来的 if(!is_uploaded_file($fileInfo['tmp_name'])){ $res['mes']=$fileInfo['name'].'文件不是通过HTTP POST方式上传上来的'; } if($res) return $res; //$path='./uploads'; if(!file_exists($path)){ mkdir($path,0777,true); chmod($path,0777); } $uniName=getUniName(); $destination=$path.'/'.$uniName.'.'.$ext; if(!move_uploaded_file($fileInfo['tmp_name'],$destination)){ $res['mes']=$fileInfo['name'].'文件移动失败'; } $res['mes']=$fileInfo['name'].'上传成功'; $res['dest']=$destination; return $res; }else{ //匹配错误信息 switch ($fileInfo ['error']) { case 1 : $res['mes'] = '上传文件超过了PHP配置文件中upload_max_filesize选项的值'; break; case 2 : $res['mes'] = '超过了表单MAX_FILE_SIZE限制的大小'; break; case 3 : $res['mes'] = '文件部分被上传'; break; case 4 : $res['mes'] = '没有选择上传文件'; break; case 6 : $res['mes'] = '没有找到临时目录'; break; case 7 : case 8 : $res['mes'] = '系统错误'; break; } return $res; } }
Copier après la connexion

puis utilise l'attribut multiple dans le statique pour réaliser l'entrée de plusieurs fichiers

function getExt($filename){ return strtolower(pathinfo($filename,PATHINFO_EXTENSION)); } /** * 产生唯一字符串 * @return string */ function getUniName(){ return md5(uniqid(microtime(true),true)); }
Copier après la connexion

doAction6. php

    Insert title here 
请选择您要上传的文件:
Copier après la connexion

4. Téléchargement de fichiers orientés objet

'; $uploadFiles[]=@$res['dest']; } $uploadFiles=array_values(array_filter($uploadFiles)); //print_r($uploadFiles);
Copier après la connexion
rrree


5. Téléchargement


    Insert title here 
下载1.rar
下载1.jpg
通过程序下载1.jpg
下载nv.jpg
Copier après la connexion

        
Copier après la connexion

总结:



二维数组的降维处理;

$_FILES变量

move_upload_file();copy();

tmp_name临时文件;

拓展名的提取;

真实图片的验证;

唯一文件名的生成;

函数封装以及调用;

利用单个文件函数实现多文件上传;

小功能的封装;

多文件的遍历;

面向对象的开发过程;

下载;

以上就是全部的讲解,希望可以帮助到大家,有错误的地方请指出。

更多相关问题请访问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!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
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
Derniers articles par auteur
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!