• 文件系统处理(二)


    文件的上传下载
      在B/S程序中文件上传已经成为一个常用功能。其目的是客户可以通过浏览器(Browser)将文件上传到服务器(Server)上的指定目录。

    客户端浏览器通过上传form表单向服务器上传文件
    代码:

     1 <html>
     2     <head><title>文件上传</title></head>
     3     <body>
     4         <form action="upload.php" method="post" enctype="multipart/form-data">
     5         <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
     6         选择文件:<input type="file" name="myfile">
     7         <input type="submit" value="上传文件">
     8         </form>
     9     </body>
    10 </html>        

    注意:
    POST提交方法:表单提交只有GET和POST两种,而GET传递数据量小,只能(必须)选择POST
    enctype="multipart/form-data"通过这个属性浏览器告诉服务器将要上传文件,这样务器可以知道上载的文件带有常规的表单信息。
    隐藏表单MAX_FILE_SIZE此字段必须在文件输入字段之前,控制最大的传递文件的大小(字节)。客户端配置,可被跳过,防君子不防小人)

    多文件上传:<input type="file" name="myfile[]"/>可以添加属性multiple使得可以选择多个文件

    服务器端通过PHP管理文件上传
    需要以下三个方面的信息:
      1.设置PHP配置文件中的指令:用于精细的调节PHP的文件上传功能。
            php.ini的配置信息
        file_uploads = On /Off 是否允许文件上传
        upload_max_filesize=2M 上传的文件的最大大小
        post_max_size = 8M POST数据所允许的最大大小
        upload_tmp_dir 上传文件放置的临时目录

    注意配置:upload_max_filesize的大小一定要小于post_max_size的配置大小。


      2.$_FILES多维数组:用于存储各种与上传文件有关的信息,其他数据还使用$_POST去接收
        $_FILES["myfile"]["name"] 客户端机器文件的原始名称,包含扩展名
        $_FILES["myfile"]["size"] 已上传文件的大小,单位字节
        $_FILES["myfile"]["tmp_name"] 文件被上传后再服务器端存储的临时文件名(这是存储在临时目录【由PHP指令upload_tmp_dir指定】中时所指定非文件名)
        注意:脚本结束后自动删除
        $_FILES["myfile"]["error"] 伴随文件上传时产生的错误信息
            error:上传的错误号:0--4
                  0:表示没有发生任何错误。
                  1:上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
                  2:表示上传文件大小超出了HTML表单隐藏域属性的MAX_FILE_SIZE元素所指定的最大值。
                  3:表示文件只被部分上传。
                  4:表示没有上传任何文件。
                  6:找不到临时文件夹
                  7:文件写入失败
                  $_FILES["myfile"]["type"] 获取从客户端上传文件的MIME类型


      3.PHP文件上传处理函数:用于上传文件的后续处理。
        函数is_uploaded_file()判断指定的文件是否通过HTTP POST上传,如果是返回true
        bool is_uploaded_file(string filename)
        唯一的参数必须指定类似与$_FILES["myfile"]["tmp_name"]的变量,而不能是客户端上传的文件名$_FILES["myfile"]["name"]

        函数move_uploaded_file()文件上传后会先存入临时目录中,需要使用此函数将上传文件移动到指定位置
        bool move_uploaded_file(string filename,string destination)
        虽然copy和move一样可以做到这个功能但是函数move_uploaded_file()还提供一个功能,即检查并确保第一个参数filename指定的文件是否是合法上传文件。合法则移动,不合法则不执行任何操作返回false,发出一条警告。移动成功返回true。

        处理多文件上传:
          上传一个文件时全局数组$_FILES为一个二维数组,当使用多文件上传全局数组$_FILES已经变成一个三维数组,这样就可以存储多个上传文件的信息。

        文件的下载
          1.获取要下载的图片名(加上路径)
            $file="./uploads/".$_GET['name'];
          2.重设响应类型
            $info=getimagesize['mime'];
            header("content-type:".$info);改变响应类型

          3.指定下载的文件名
            header("content-disposition:attachment;filename=".$GET["name"]);

          4.指定文件的大小
            header("content-length:".filesize($file));
          5.响应内容
            readfile($file);

     1 <?php
     2 //文件上传函数
     3 function upload($path,$upfile,$typeList=array(),$maxSize=0){
     4     //定义返回信息数组
     5     $res = array(
     6                 "info"=>"",
     7                 "error"=>false
     8                 );
     9                 
    10     //格式化文件上传路径
    11     $path=rtrim($path,"/")."/";
    12     
    13     if($upfile['error']>0){
    14         switch($upfile['error']){
    15             case 1:
    16                 $info="上传文件的大小超出了约定值!";
    17                 break;
    18             case 2:
    19                 $info="上传文件大小超出了HTML表单隐藏域属性的MAX_FILE_SIZE元素所指定的最大值。";
    20                 break;
    21             case 3:
    22                 $info="文件只被部分上传!";
    23                 break;
    24             case 4:
    25                 $info="没有上传任何文件。";
    26                 break;
    27             case 6:
    28                 $info="找不到临时文件夹。";
    29                 break;
    30             case 7:
    31                 $info="文件写入失败。";
    32                 break;
    33         }
    34         $res['info']="上传失败!原因:".$info;
    35         return $res;
    36     }
    37     
    38     //判断文件上传类型是否合法
    39     if(@$typeList && count(@$typeList)>0){
    40         
    41         if(!in_array($upfile['type'],$typeList)){
    42             $info="不被允许的上传文件类型!";
    43             $res['info']="上传失败!原因:".$info;
    44         return $res;
    45         }
    46     }else{
    47         $info="上传失败!原因:服务器没有设定允许上传的文件类型!";
    48         $res['info']="上传失败!原因:".$info;
    49         return $res;
    50     }
    51     
    52     //判断上传文件大小是否合法
    53     if($maxSize>0&&$upfile['size']>$maxsize){
    54         $info="上传文件大小越界!";
    55         $res['info']="上传失败!原因:".$info;
    56         return $res;
    57     }
    58     
    59     //随机一个文件名
    60     $pathinfo=pathinfo($upfile['name']);
    61     @$ext=$pathinfo['extension'];
    62     
    63     do{
    64         $newname=date("YmdHis",time()).rand(1000,9999).".".$ext;
    65     }while(file_exists($path.$newname));
    66     
    67     //执行上传文件的移动
    68     if(is_uploaded_file($upfile['tmp_name'])){
    69         if(move_uploaded_file($upfile['tmp_name'],$path.$newname)){
    70             $info="恭喜,上传成功!文件名:".$newname;
    71             $res['info']=$info;
    72             $res['error']=true;
    73             return $res;
    74         }else{
    75             $info="移动上传文件失败!";
    76             $res['info']="上传失败!原因:".$info;
    77         return $res;
    78         }
    79     }else{
    80         $info="不是有效的上传文件!";
    81         $res['info']="上传失败!原因:".$info;
    82         return $res;
    83     }
    84 }
    85 ?>



  • 相关阅读:
    作为一名JAVA程序员应该有怎样的就业思维
    Html +++++css总结
    spring知识点全部复习
    Spring注解问题,[action中注入service失败
    VMware中Ubuntu18配置静态IP地址
    MySQL5.7修改登录密码的几种方式
    MySQL忘记root密码
    Windows安装Redis
    Java两个整数相除保留n位小数
    Java四舍五入保留n位小数的常用写法
  • 原文地址:https://www.cnblogs.com/yexiang520/p/5554877.html
Copyright © 2020-2023  润新知