PHP文件上传

原理:

文件从用户本地电脑通过传输方式(web表单)保存到服务器所在电脑指定的目录下。

1、增加文件上传的表单:浏览器请求一个服务器的HTML脚本(包含文件上传表单)

2、用户从本地选择一个文件(点击上传框(按钮) )

3、用户点击上传:文件会通过互联网传输到服务器上

4、服务器操作系统会将文件保存到临时目录:以临时文件格式保存(windows下tmp)

5、服务器脚本开始工作:判断文件有效

6、服务器脚本将有效文件从临时目录移动到指定目录下(完成)

 

PHP文件上传_第1张图片

 

表单写法

method属性:表单提交方式必须为POST

enctype属性:form表单属性:主要是规范表单数据的编码方式

PHP文件上传_第2张图片

 上传表单:file表单

PHP文件上传_第3张图片

 


$_FILES变量详解(该变量必须大写)

在PHP中,有一个预定义变量$_files是专门用来存储用户上传的文件

PHP文件上传_第4张图片

 

name:文件在用户(浏览器端)电脑上实际存在的名字(实际用来保留后缀)

tmp_name:文件上传到服务器后操作系统保存的临时路径(实际用来给PHP后期使用)

type:MIME(多功能互联网邮件扩展)类型,用来在计算机中客户端识别文件类型(确定软件)

error:文件上传的代号,用来告知应用软件(PHP)在文件接收过程中出现了什么问题(PHP后期根据代码进行文件判断)

PHP文件上传_第5张图片

size:文件大小(PHP根据实际需求确定是否该保留)

 


移动临时文件到目标位置

文件上传之后会保存到$_files中,那么访问文件信息的形式就是$_files['表单 name属性值']['元素信息']...

1、判断是否为上传的文件:is_uploaded_file()

2、移动文件:move_upload_file()

PHP文件上传_第6张图片

 


多文件上传

场景:

当商品需要上传多个图片进行展示的时候:那么需要使用多文件上传

         针对一个内容,但是不同文件:同名表单

PHP文件上传_第7张图片

当商品需要进行多个维度图片说明的时候:需要使用多文件上传

         针对不同内容,所以表单名字不同:批量解决问题

PHP文件上传_第8张图片

多文件上传的$_FILES变量的数据结构形式

批量上传:同名表单

将表单名字形成一个数组,而且同时将文件对应的五个要素:name、tmpname、size、type、error都形成对应数量的数组

PHP文件上传_第9张图片

 

批量上传:不同名表单

每个文件都会形成一个属于自己独立的5个元素的数组

PHP文件上传_第10张图片

 

对于拿到的两种结果的处理:对多文件信息的遍历读取和处理

1、不同名多文件上传:

按照表单名字从$_FILES中取出来就可以直接使用(明确知道表单中有多少个文件上传);如果不确定表单中有多少个文件上传,不适合挨个去取(效率不高),可以通过遍历$_FILES数组,挨个取出来实现文件上传

foreach($_FILES as $file){
    //$file就是一个完整的上传文件信息
    //找到临时路径,指定存放路径
    if (is_uploaded_file($file['tmp_name'])){
        //存储
        move_uploaded_file($file['tmp_name'],'uploads/' . $file['name']);
    }
}

2、同名多文件上传:

想办法得到一个文件对应的五个元素数组。从$_FILES中把对应的name/tmp_name/size/error/type 挨个取出来,然后存放到不同的数组中

此时遍历$_FILES没有意义,只有一个数组元素;应该遍历$_FILES['userfile'] ['任意一个要素:name/tmp_name/size/error/type']

    //判断元素存在而且是数组:name有:代表是文件,name元素有多个,代表是同名批量上传
if(isset($_FILES['image']['name']) && is_array() ){
    //遍历,构造数组元素
    $image = array();        //存储所有的文件信息,一个元素代表一个文件(数组)
    foreach($_FILES['image']['name'] as $k => $file){

        $images = array(
            'name' => $file ,
            'tmp_name' => $_FILES['image']['tmp_name'][$k],
            'type' => $_FILES['image']['type'][$k],
            'error' => $_FILES['image']['error'][$k],
            'size' => $_FILES['image']['size'][$k]
        );        
    }
}

你可能感兴趣的:(PHP入门)