文件系统处理(二)

文件的上传下载
  在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 ?>
时间: 2024-11-03 05:32:40

文件系统处理(二)的相关文章

分析Linux磁盘管理与文件系统专题二

1.关于设备文件 A 我们知道常见的设备文件有:字符设备文件(character),块设备文件(block). B 块设备,简写b,随机访问,比如硬盘. C 字符设备,简写c,线性访问,比如键盘,鼠标,显示器. D 我们的设备文件常常在/dev目录下,并且没有大小.因为设备文件只是作为设备访问   的入口. E 设备文件,一般用major(主设备号),minor(次设备号)进行标示.主设备号标示设备类型,次设备号标示同一种类型设备下的不同设备. 2.创建设备文件实例 [[email protec

php学习基础-文件系统(二) 文件读写操作、文件资源处理

一.文件的打开与关闭 /* *读取文件中的内容 * file_get_contents(); //php5以上 * file() * readfile(); * * 不足:全部读取, 不能读取部分,也不能指定的区域 * * fopen() * fread() * fgetc() * fgets() * * * * * 写入文件 * file_put_contents("URL", "内容字符串"); //php5以上 * 如果文件不存在,则创建,并写入内容 * 如果

class-4 Linux文件系统(二)及IO重定向

一.文件系统(二) 1.文件通配符 作用:可以批量的选择出符合要求的文件或目录 *  匹配零个或多个字符 ?  匹配任何单个字符 ~  当前用户家目录 ~username  用户家目录 [[email protected] /]# cd ~lvasu [[email protected] lvasu]# ls ~+  当前工作目录 ~- 前一个工作目录 # ls  ~-/issue      [[email protected] ~]# ls   a    anaconda-ks.cfg  in

Linux磁盘及文件系统(二)Linux下磁盘命名和分区

在为主机添加硬盘之前,首先需要了解Linux系统下对硬盘和分区的命令方法 一.磁盘命名 Linux下对SCSI和SATA设备是以sd命名的,第一个SCSI设备是sda,第二个是sdb....以此类推.一般主板上有两个SCSI接口,因此一共可以安装4个SCSI设备.主SCSI上的两个设备分别对应sda和sdb,第二个SCSI口上的设备对应sdc和sdd.一般硬盘安装在SCSI的主接口上,所以是sda和sdb,而光驱一般安装在第二个SCSI的主接口上,所以是sdc.IDE有两个口,第一个IDE口叫做

深入理解Linux文件系统编程(二)

Linux文件系统编程实战 一.创建文件 <span style="font-size:14px;">#include<stdio.h> #include<stdlib.h> #include<sys/stat.h> #include<fcntl.h> //创建文件子函数 void creat_file(char *filename) { int fd; //系统调用描述文件的文件描述符(为非负数) if(fd=creat(f

linux文件系统 - 初始化(二)

一.目的 本文主要讲述linux3.10文件系统初始化过程的第二阶段:加载initrd. initrd是一个临时文件系统,由bootload负责加载到内存中,里面包含了基本的可执行程序和驱动程序.在linux初始化的初级阶段,它提供了一个基本的运行环境.当成功加载磁盘文件系统后,系统将切换到磁盘文件系统并卸载initrd. 如果是嵌入式设备,那么最终的文件系统就是initrd. 二.cpio文件格式 initrd常用的的文件格式是cpio,cpio格式记录了文件系统的结构和内容. cpio格式具

向下之旅(十八):虚拟文件系统(二)

目录项对象 VFs把目录当做文件对待,所以在路径/bin/vi中,bin和vi都属于文件——bin是特殊的目录文件而vi是一个普通文件.路径中的每个组成部分都由一个索引节点对象表示.虽然它们可以统一由索引节点表示,但是VFS经常需要执行目录相关的操作,比如路径名查找等.路径名查找需要解析路径中的每一个组成部分,不但要确保它有效,而且还需要再进一步寻找路径中的下一个部分. 为了方便查找操作.VFS引入了目录项的概念.每个dentry代表路径中的一个特定的部分,对前一个例子来说,/.bin和vi都属

分布式文件系统glusterfs(二)

1.GlusterFS简述    分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源并不直接与本地节点相连,而是分布于计算网络中的一个或者多个节点的计算机上.目前意义上的分布式文件系统大多都是由多个节点计算机构成,结构上是典型的客户机/服务器模式.流行的模式是当客户机需要存储数据时,服务器指引其将数据分散的存储到多个存储节点上,以提供更快的速度,更大的容量及更好的冗余特性.GlusterFS系统是一个可扩展的网络文件系统,相比其他分布式文件系统,Glu

CentOS7搭建FastDFS V5.11分布式文件系统(二)

1.CentOS7 FastDFS搭建 前面已下载好了要用到的工具集,下面就可以开始安装了: 如果安装过程中出现问题,可以下载我提供的,当前测试可以通过的工具包: 点这里点这里 1.1 安装libfastcommon 安装成功后解压libfastcommon-master.zip unzip libfastcommon-master.zip [[email protected] libfastcommon-1.0.36]# ll drwxr-xr-x. 2 root root 4096 4月 5