1. Prinzip und Konfiguration hochladen
1.1 Prinzip
Laden Sie die Client-Datei auf den Server hoch und verschieben Sie dann die serverseitige Datei (temporäre Datei). Das angegebene Verzeichnis reicht aus.
1.2 Client-Konfiguration
erforderlich: Formularseite (Upload-Datei auswählen);
Im Einzelnen: Die Sendemethode ist POST
, fügen Sie das Attribut enctype="multipart/form-data"
hinzu. Beides ist der Fall unverzichtbar (allerdings existieren Vor- und Nachteile nebeneinander, hier gibt es auch Einschränkungen bei der Upload-Methode und dem Aufruf nach dem Hochladen der Datei etc., worauf später noch eingegangen wird
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="doAction.php" method="post" enctype="multipart/form-data"> 请选择您要上传的文件: <input type="file" name="myFile" /><br/> <input type="submit" value="上传"/> </form> <?php ?> </body> </html>
Zuerst ist die Formularseite (bitte ignorieren Sie das Frontend). wird automatisch ausgegeben. . Der andere ist die Verwendung von type="file" (was die leistungsstarke Erweiterung von PHP usw. widerspiegelt) und dann doAction.php
<?php //$_FILES:文件上传变量 //print_r($_FILES); $filename=$_FILES['myFile']['name']; $type=$_FILES['myFile']['type']; $tmp_name=$_FILES['myFile']['tmp_name']; $size=$_FILES['myFile']['size']; $error=$_FILES['myFile']['error']; //将服务器上的临时文件移动到指定位置 //方法一move_upload_file($tmp_name,$destination) //move_uploaded_file($tmp_name, "uploads/".$filename);//文件夹应提前建立好,不然报错 //方法二copy($src,$des) //以上两个函数都是成功返回真,否则返回false //copy($tmp_name, "copies/".$filename); //注意,不能两个方法都对临时文件进行操作,临时文件似乎操作完就没了,我们试试反过来 copy($tmp_name, "copies/".$filename); move_uploaded_file($tmp_name, "uploads/".$filename); //能够实现,说明move那个函数基本上相当于剪切;copy就是copy,临时文件还在 //另外,错误信息也是不一样的,遇到错误可以查看或者直接报告给用户 if ($error==0) { echo "上传成功!"; }else{ switch ($error){ case 1: echo "超过了上传文件的最大值,请上传2M以下文件"; break; case 2: echo "上传文件过多,请一次上传20个及以下文件!"; break; case 3: echo "文件并未完全上传,请再次尝试!"; break; case 4: echo "未选择上传文件!"; break; case 5: echo "上传文件为0"; break; } }
Schauen wir uns zuerst die
Informationen anArray ( [myFile] => Array ( [name] => 梁博_简历.doc [type] => application/msword [tmp_name] => D:\wamp\tmp\php1D78.tmp [error] => 0 [size] => 75776 ) )
print_r($_FILES)
Wie man es verwendet, sind alles grundlegende Dinge (tatsächlich mag ich es). Reduzieren Sie die Dimension und verwenden Sie sie dann); Name, Sie können ihn später verwenden); Dann schauen Sie sich hier doAction an. Im letzten Teil werden Fehlerinformationen verwendet, um dem Benutzer eine Rückmeldung zu geben was die Fehlerinformationen sind
1.3 Informationen zur Fehlerberichterstattungtmp_name
error
Grundsätzlich geht sie über die des Servers hinaus oder entspricht nicht diesen Konfiguration zum Hochladen von Dateien. Was sind also die serverseitigen Konfigurationen? 🎜>
:Ein= - temporäres Dateispeicherverzeichnis
= 2M=20——Die maximale Anzahl Anzahl der Dateien, die gleichzeitig hochgeladen werden dürfen (beachten Sie den Unterschied zum obigen, denken Sie nicht darüber nach, ob es eine Größe gibt)
file_upload
=8M – Der maximale Wert der gesendeten Daten Post-Modus
upload_tmp_dir
Andere verwandte Konfigurationen
upload_max_filesize
max_file_uploads
post_max_size
Kurz gesagt, es ist Alles über die Ressourcenkonfiguration.
--Fehlernummermax_exectuion_time
max_input_time
Wert: 0; Datei-Upload war erfolgreich 🎜>
max_input_nesting_level
Wert: 4;
memory_limit
Hinweis: Bei dieser Fehlermeldung handelt es sich um die im ersten Schritt hochgeladenen Informationen, also beim Hochladen in einen temporären Ordner, nicht beim Verschieben oder Kopieren.
2. Upload-bezogene Einschränkungen
2.1 Client-Einschränkungen<form action="doAction2.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="101321" /> 请选择您要上传的文件: <input type="file" name="myFile" accept="image/jpeg,image/gif,text/html"/><br/> <input type="submit" value="上传"/> </form>
UPLOAD_ERR_OK
Hier werden die Eingabeattribute verwendet, um die Größe und den Typ zu steuern Es gibt Einschränkungen, aber mein persönliches Gefühl ist: Erstens ist der HTML-Code "sichtbar"; zweitens funktioniert er oft nicht (den Grund habe ich nicht gefunden, aber wegen des ersten möchte ich auch Um es aufzugeben, wissen Sie es einfach. UPLOAD_ERR_INI_SIZE
2.2 Serverseitige Einschränkungen UPLOAD_ERR_FORM_SIZE
begrenzen hauptsächlich Größe und Typ, und dann gibt es noch die Methode zur Kapselung von UPLOAD_ERR_PARTIAL
Funktionen <?php header('content-type:text/html;charset=utf-8'); //接受文件,临时文件信息 $fileinfo=$_FILES["myFile"];//降维操作 $filename=$fileinfo["name"]; $tmp_name=$fileinfo["tmp_name"]; $size=$fileinfo["size"]; $error=$fileinfo["error"]; $type=$fileinfo["type"]; //服务器端设定限制 $maxsize=10485760;//10M,10*1024*1024 $allowExt=array('jpeg','jpg','png','gif');//允许上传的文件类型(拓展名 $ext=pathinfo($filename,PATHINFO_EXTENSION);//提取上传文件的拓展名 //目的信息 $path="uploads"; if (!file_exists($path)) { //当目录不存在,就创建目录 mkdir($path,0777,true); chmod($path, 0777); } //$destination=$path."/".$filename; //得到唯一的文件名!防止因为文件名相同而产生覆盖 $uniName=md5(uniqid(microtime(true),true)).$ext;//md5加密,uniqid产生唯一id,microtime做前缀 if ($error==0) { if ($size>$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; } }
UPLOAD_ERR_NO_FILE
aufrufen <?php function uploadFile($fileInfo,$path,$allowExt,$maxSize){ $filename=$fileInfo["name"]; $tmp_name=$fileInfo["tmp_name"]; $size=$fileInfo["size"]; $error=$fileInfo["error"]; $type=$fileInfo["type"]; //服务器端设定限制 $ext=pathinfo($filename,PATHINFO_EXTENSION); //目的信息 if (!file_exists($path)) { mkdir($path,0777,true); chmod($path, 0777); } $uniName=md5(uniqid(microtime(true),true)).'.'.$ext; $destination=$path."/".$uniName; if ($error==0) { if ($size>$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; }
3. Implementierung des Hochladens mehrerer Dateien
3.1 Einzeldateikapselung verwenden<?php
header('content-type:text/html;charset=utf-8');
$fileInfo=$_FILES["myFile"];
$maxSize=10485760;//10M,10*1024*1024
$allowExt=array('jpeg','jpg','png','tif');
$path="uploads";
include_once 'upFunc.php';
uploadFile($fileInfo, $path, $allowExt, $maxSize);
Ändern Sie die Definition der Funktion oben und geben Sie etwas an! Standardwerte
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="doAction5.php" method="post" enctype="multipart/form-data"> 请选择您要上传的文件:<input type="file" name="myFile1" /><br/> 请选择您要上传的文件:<input type="file" name="myFile2" /><br/> 请选择您要上传的文件:<input type="file" name="myFile3" /><br/> 请选择您要上传的文件:<input type="file" name="myFile4" /><br/> <input type="submit" value="上传"/> </form> </body> </html>
Auf diese Weise ist es einfach, aber es gibt einige Probleme Problem
Das Hochladen von 4 Bildern ist normalerweise kein Problem, aber wenn der Exit in der Funktion aktiviert ist wird sofort angehalten, was dazu führt, dass keine anderen Bilder hochgeladen werden können.
Paket der aktualisierten Version 3.2
Ziel ist es, mehrere oder einzelne Datei-Uploads zu kapseln.Zuerst schreiben eine statische Datei wie diese<?php //print_r($_FILES); header('content-type:text/html;charset=utf-8'); include_once 'upFunc.php'; foreach ($_FILES as $fileInfo){ $file[]=uploadFile($fileInfo); }
function uploadFile($fileInfo,$path="uploads",$allowExt=array('jpeg','jpg','png','tif'),$maxSize=10485760){
Es ist kompliziert, aber die Werte sind alle zusammen , also ist es für uns sehr praktisch, zuerst die Dateiinformationen abzurufen und sie in eine einzige Dateiverarbeitungsinformation umzuwandeln
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="doAction5.php" method="post" enctype="multipart/form-data"> 请选择您要上传的文件:<input type="file" name="myFile[]" /><br/> 请选择您要上传的文件:<input type="file" name="myFile[]" /><br/> 请选择您要上传的文件:<input type="file" name="myFile[]" /><br/> 请选择您要上传的文件:<input type="file" name="myFile[]" /><br/> <input type="submit" value="上传"/> </form> </body> </html>
Dann ändern Sie einfach den Exit-Fehler wie zuvor 🎜>
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 ) ) )
print_r($_FILES)
Es kapselt zwei kleine 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; }
und verwendet dann das multiple Attribut in der Statik, um die Eingabe mehrerer Dateien
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; } }
< zu realisieren 🎜>
function getExt($filename){ return strtolower(pathinfo($filename,PATHINFO_EXTENSION)); } /** * 产生唯一字符串 * @return string */ function getUniName(){ return md5(uniqid(microtime(true),true)); }
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="doAction6.php" method="POST" enctype="multipart/form-data"> 请选择您要上传的文件:<input type="file" name="myFile[]" multiple='multiple' /><br/> <input type="submit" value="上传"/> </form> </body> </html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Insert title here</title> </head> <body> <a href="1.rar">下载1.rar</a> <br /> <a href="1.jpg">下载1.jpg</a> <br /> <a href="doDownload.php?filename=1.jpg">通过程序下载1.jpg</a> <br /> <a href="doDownload.php?filename=../upload/nv.jpg">下载nv.jpg</a> <?php ?> </body> </html>
<?php $filename=$_GET['filename']; header('content-disposition:attachment; filename='.basename($filename)); header('content-length:'.filesize($filename)); readfile($filename);
总结:
<input type="file" name="myFile" /><br/>
二维数组的降维处理;
$_FILES变量
move_upload_file();copy();
tmp_name临时文件;
拓展名的提取;
真实图片的验证;
唯一文件名的生成;
函数封装以及调用;
利用单个文件函数实现多文件上传;
小功能的封装;
多文件的遍历;
面向对象的开发过程;
下载;
以上就是全部的讲解,希望可以帮助到大家,有错误的地方请指出。
更多相关问题请访问PHP中文网:PHP视频教程
Das obige ist der detaillierte Inhalt vonPHP-Implementierung von Datei-Upload- und Download-Beispielen, ausführliche Erklärung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!