PHP之简单文件上传
1 <html> 2 <head><meta http-equiv="Content-Type" content="text/html" charset="utf-8"/> 3 </head> 4 <body> 5 <form action="up.php" method="post" enctype="multipart/form-data"> 6 <input type="hidden" name="MAX_FILE_SIZE" value="1000000"> 7 选择文件:<input type='file' name='myfile'> 8 <input type='submit' value='上传文件'> 9 </form> 10 </body> 11 </html>
这是上传页面:
1 <?php 2 /** 3 project:上传文件,并转移到服务器uploads文件中 4 file:up.php 5 */ 6 $allowtype=array('gif','png','jpg'); //设置允许上传的文件类型 7 $size= 1000000; //设置允许大小为1mb(1 000 000字节)以内的文件 8 $path="./uploads"; //设置上传后保存文件的路径 9 10 //判断文件是否可以成功上传到服务器,$_FILES['myfile']['error']为0表示上传成功 11 if($_FILES['myfile']['error']>0){ 12 echo "上传错误<br>"; 13 switch($_FILES['myfile']['error']){ 14 case 1: die("上传文件大小超出了PHP配置文件的限制<br>"); 15 case 2: die("上传文件大小超出了表单的限制<br>"); 16 case 3: die("文件只被部分上传<br>"); 17 case 4: die("没有上传任何文件<br>"); 18 case 5: die("未知错误<br>"); 19 } 20 } 21 22 23 //通过文件上传文件的扩展名判断上传的文件是否允许的类型 24 $fdata=explode(".",$_FILES['myfile']['name']); 25 $hz=array_pop($fdata); 26 if(!in_array(strtolower($hz),$allowtype)){ 27 die("这个文件不允许上传<br>"); 28 } 29 /* 30 list($maintype,$subtype)=explode("/",$_FILES['myfile']['type']); 31 if($maintype!="image"){ 32 die("这个文件不允许上传<br>"); 33 } 34 */ 35 //判断上传文件是否允许大小 36 if($_FILES['myfile']['size']>$size){ 37 die("超过允许的字节大小<br>"); 38 } 39 40 //为了系统安全,也为同名文件不会被覆盖,上传后文件名使用名使用系统定义 41 $filename=date("YmdHis").rand(100,999).".".$hz; 42 43 //判断是否为HTTP POST上传文件 44 if(is_uploaded_file($_FILES['myfile']['tmp_name'])){ 45 if(!move_uploaded_file($_FILES['myfile']['tmp_name'],$path.'/'.$filename)){ 46 die("不能移动到指定目录<br>"); 47 } 48 }else{ 49 die("问题:上传文件{$_FILES['myfile']['name']}不是一个合法文件<br>"); 50 } 51 52 //如果文件上传成功则输出 53 echo "文件{$_FILES['myfile']['name']}上传成功,保存在目录{$path}中,大小为{$_FILES['myfile']['size']}字节<br>";
up.php文件是在《细说PHP》上有,但是部分代码是有错的:
错误1:
$hz=array_pop(explode('.',$_FILES['myfile']['name']));
这句代码会出现错误提示:
Only variables should be passed by reference
Only variables should be passed by reference,即该方法的变量(variables )只能通过引用(reference)来传递。一般是传参导致的错误。
常见情况,直接拿explode()的结果去传入给某个方法,而这个方法的变量(variables )只能通过引用(reference)来传递。
这里explode()返回的是一个数组(array)的值(即,具体的内容),而array_pop()的变量要求是一个引用(reference)。
具体见文档 mixed array_pop ( array &$array )。
类似的array_shift(),end(),prev()等等都会报以上的错误。
【解决办法】:
将explode()返回的数组先赋值给一个变量,再将变量传入该方法即可。
$fdata=explode('.',$_FILES['myfile']['name']); $hz=array_pop($fdata);
array_pop()删除数组的最后一个元素并返回
错误2:也不能说是错误,只是考虑不周到
if(!in_array($hz,$allowtype)){```}
由于后缀名有可能是大写的,所以有必要将$hz经过strtolower()函数处理一下,如上面的第二块代码所示.
结果:
(顶不住了,我要回学校!==!)
参考:
《细说PHP》
https://www.landui.com/help/show-9127.html