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

 

posted @ 2020-02-27 22:39  叶际参差  阅读(301)  评论(0编辑  收藏  举报