文件系统处理(二)

文件的上传下载
  在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 ?>



原文地址:https://www.cnblogs.com/yexiang520/p/5554877.html