zoukankan      html  css  js  c++  java
  • PHP 注意问题

    一、表单 

        1,上传文件的表单使用post方式;还要加上enctype='multipart/form-data'。 
        2,一般要加上隐藏域:<input type=hidden name='MAX_FILE_SIZE' value=dddddd>,位置在file域前面。value的值是上传文件的客户端字节限制。据说可以减少文件超标时客户端的等待时间,不过我没觉得有什么区别。 
        3,file域是不许赋值的(无value="")。

    HTML 就已经设置了文件大小,所有有时候你在PHP中接收不到值的时候很有可能就是前台给阻止了

    二,文件上传错误代码 

        预定义变量$_FILES数组有5个内容: 
        $_FILES['userfile']['name']——客户端机器文件的原名称 
        $_FILES['userfile']['type']——文件的 MIME 类型 
        $_FILES['userfile']['size']——已上传文件的大小,单位为字节 
        $_FILES['userfile']['tmp_name']——文件被上传后在服务端储存的临时文件名 
        $_FILES['userfile']['error']——和该文件上传相关的错误代码 

        其中$_FILES['userfile']['error']的可以有下列取值和意义: 
        0——没有错误发生,文件上传成功。  
        1——上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。  
        2——上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。  
        3——文件只有部分被上传。  
        4——没有文件被上传。  
         
        1~3不用说了。 
        “没有文件被上传”(4)是指表单的file域没有内容,是空字符串。 
        “文 件上传成功”(0)不一定真的有文件上传了。比如你打了个“c:”给file域,就可以“上传成功”——错误代码是0,['name']是“c:”, ['type']是“application/octet-stream”,['size']是0,['tmp_name']是“xxx.tmp” (xxx是服务器起的名字) 
         
    三,文件大小限制和检验 

        限制上传文件大小的因素有 
        1,客户端的隐藏域MAX_FILE_SIZE的数值(可以被绕开)。 
        2,服务器端的upload_max_filesize,post_max_size和memory_limit。这几项不能够用脚本来设置。 
        3,自定义文件大小限制逻辑。即使服务器的限制是能自己决定,也会有需要个别考虑的情况。所以这个限制方式经常是必要的。 
         
        我碰见的一种情况可能不是普遍性的,说明一下。如 果文件比服务器端限制(upload_max_filesize)大很多,但也还没达到或接近post_max_size或者 memory_limit,$_FILES就会“崩溃”——结果是$_FILES['userfile']变成了“Undefined index”,当 然是什么检验也做不到了。 

        服 务器端限制的检验优先于客户端限制的检验。就是说,如果两个限制是一样的,而文件过大了,$_FILES['userfile']['error']会出 错误代码1。只有客户端限制比服务器端限制小到一定“程度”,而且文件大小超过两者的时候,才会出现错误代码2(难道这跟我感觉 MAX_FILE_SIZE没起到预想的作用是一个原因?)。上述的“程度”,在我的机器上试验在3~4K之间——我的机器设置的服务器端限制为2M…… 因为没什么意味,就没有追求精确的规律。 

        出现错误代码1或2的时候: 
        $_FILES['userfile']['name']为客户端机器文件的原名称 
        $_FILES['userfile']['type']为空字符串 
        $_FILES['userfile']['size']为0 
        $_FILES['userfile']['tmp_name']为空字符串 

    四,文件路径检验 

        回顾一下: 
         
        file域无输入,错误代码为4(无文件上传) 
        $_FILES['userfile']['name']为空字符串 
        $_FILES['userfile']['type']为空字符串 
        $_FILES['userfile']['size']为0 
        $_FILES['userfile']['tmp_name']为空字符串 
         
        file域是非文件路径的字符串(不考虑客户端的假“限制”了),错误代码是0(“上传成功”) 
        $_FILES['userfile']['name']为原字符串 
        $_FILES['userfile']['type']为application/octet-stream 
        $_FILES['userfile']['size']为0 
        $_FILES['userfile']['tmp_name']为一个暂时文件名 

    五,is_uploaded_file()的返回值 

        手册上面不很详细地说,用法是: 
            bool is_uploaded_file( string filename) 
        实际上 
            is_uploaded_file($_FILES['userfile']['name']); 
        总是返回FALSE。后来看见别人是用: 
            is_uploaded_file($_FILES['userfile']['tmp_name']); 

        比较一下: 

        file域无输入——————返回FALSE——error=>4,name=>'',   tmp_name=>'',   type=>'',   size=>0 
        file域为非路径字符串——返回 TRUE——error=>0,name=>'xxx',tmp_name=>'yyy',type=>'zzz',size=>0 
        文件上传成功——————返回 TRUE——error=>0,name=>'xxx',tmp_name=>'yyy',type=>'zzz',size=>sss 
        文件太大————————返回FALSE——error=>1,name=>'xxx',tmp_name=>'',   type=>'',   size=>0 
        文件太大————————返回FALSE——error=>2,name=>'xxx',tmp_name=>'',   type=>'',   size=>0 
        文件部分上传——————没机会试验 —error=>3 

        有点怀疑这个函数是怎么工作的,还是觉得用$_FILES['userfile']['size']检验好些。 

    if($_FILES['userfile']['error']!=4){//有文件上传
            if($_FILES['userfile']['error']!=3){//全部上传了
                if($_FILES['userfile']['error']!=1){//不超过服务器端文件大小限制
                    if($_FILES['userfile']['error']!=2){//不超过客户端文件大小限制
                        if($_FILES['userfile']['size']>0){//确实是文件
                            if(......){//自定义文件大小检验逻辑
                                if(......){//自定义文件类型检验逻辑
                                    if(move_uploaded_file($_FILES['userfile']['tmp_name'],...))//移动文件
                                        //..........
                                    }
                                    else
                                        give_a_message(...);
                                }
                                else
                                    give_a_message(...);
                            }
                            else
                                give_a_message(...);
                        }
                        else
                            give_a_message(...);
                    }
                    else
                        give_a_message(...);
                }
                else
                    give_a_message(...);
            }
            else
                give_a_message(...);
        }
    

      

  • 相关阅读:
    May 1 2017 Week 18 Monday
    April 30 2017 Week 18 Sunday
    April 29 2017 Week 17 Saturday
    April 28 2017 Week 17 Friday
    April 27 2017 Week 17 Thursday
    April 26 2017 Week 17 Wednesday
    【2017-07-04】Qt信号与槽深入理解之一:信号与槽的连接方式
    April 25 2017 Week 17 Tuesday
    April 24 2017 Week 17 Monday
    为什么丑陋的UI界面却能创造良好的用户体验?
  • 原文地址:https://www.cnblogs.com/sunxun/p/4491930.html
Copyright © 2011-2022 走看看