PHP(12)文件上传

一、文件上传原理

文件从客户机上传至服务器指定目录。

步骤:

  1. 增加文件上传的表单。
  2. 客户机上传文件至服务器。
  3. 服务器操作系统将文件保存在临时目录。
  4. 服务器脚本判断文件有效性,将有效文件从临时目录移动到指定目录。

二、表单写法

  • method 必须是 POST。
  • enctype 必须是 multipart/form-data
    在这里插入图片描述
<body>
<form action="./index.php" method="post" enctype="multipart/form-data">
    <input type="file" name="image"/>
    <input type="submit" name="btn" value="上传文件"/>
</form>
</body>

在这里插入图片描述

三、预定义变量 $_FILES

<?php
header("Content-type:text/html;charset=utf-8");
echo '<pre>';
var_dump($_POST);
var_dump($_FILES);

在这里插入图片描述

  • name => 文件在客户机的名字。
  • type => MIME(多功能互联网邮件扩展)类型。
  • tmp_name => 文件上传到服务器的临时路径。
  • error => 文件上传的错误代号。
  • size => 文件大小。

四、移动临时文件

  • 判断是否为上传的文件:is_uploaded_file()
  • 移动临时文件:move_uploaded_file()
<?php
header("Content-type:text/html;charset=utf-8");
echo '<pre>';
//取得文件信息
$file = $_FILES['image'];

// 移动临时文化
if (is_uploaded_file($file['tmp_name'])) {
    // 是上传文件
    if (move_uploaded_file($file['tmp_name'], 'uploads/' . $file['name'])) {
        echo "文件保存成功";
    }else{
        echo '文件保存失败';
    }
} else {
    // 不是上传文件
    echo '文件上传失败';
}

在这里插入图片描述
在这里插入图片描述

五、多文件上传

1. 同名表单

  • 针对一个内容但是不同文件说明
    在这里插入图片描述
  • 批量上传后,将表单名字形成一个数组,同时将对应的五个要素都形成对应数量的数组,每个文件上传对应数组元素的下标都是一样的。
    在这里插入图片描述

2. 不同名表单

  • 针对不同内容,所以表单名字不一样。
    在这里插入图片描述
  • 每个文件都会形成一个属于自己独立的5个元素的数组。
    在这里插入图片描述

六、多文件处理

1. 同名文件

<?php
echo '<pre>';
//遍历处理
$images = $_FILES['image'];
for ($i = 0; $i < sizeof($images['name']); $i++) {
    if (is_uploaded_file($images['tmp_name'][$i])) {
        move_uploaded_file($images['tmp_name'][$i], 'uploads/' . $images['name'][$i]);
        echo $images['name'][$i] . "保存成功" . "<br>";
    }
}

在这里插入图片描述
在这里插入图片描述

2. 不同名文件

<?php
echo '<pre>';
//遍历处理
foreach ($_FILES as $FILE) {
    if (is_uploaded_file($FILE['tmp_name'])) {
        move_uploaded_file($FILE['tmp_name'], 'uploads/' . $FILE['name']);
        echo $FILE['name'] . "保存成功" . "<br>";
    }
}

在这里插入图片描述
在这里插入图片描述

七、封装文件上传函数

  1. 判断文件是否有效
  2. 判断文件存储路径是否有效
  3. 判断文件上传过程是否出错
  4. 判断MIME类型
  5. 判断文件格式
  6. 判断文件大小
  7. 判断是否是上传文件
  8. 文件重命名并移动到指定目录
<?php
header("Content-type:text/html;charset=utf-8");

function upload_single($file, $allow_type, $path, &$error, $allow_format = array(), $max_size = 2000000) {
    # 判断文件是否有效
    if (!is_array($file) || !isset($file['error'])) {
        $error = '不是一个有效的上传文件!';
        return false;
    }
    # 判断文件存储路径是否有效
    if (!is_dir($path)) {
        $error = '文件存储路径不存在';
        return false;
    }
    # 判断文件上传过程是否出错
    switch ($file['error']) {
        case 1:
        case 2:
            $error = '文件超出服务器允许大小';
            return false;
        case 3:
            $error = '文件上传过程中出现问题,只上传了一部分!';
            return false;
        case 4:
            $error = '用户没有选中要上传的文件!';
            return false;
        case 6:
        case 7:
            $error = '文件保存失败!';
            return false;
    }
    # 判断MIME类型
    if (!in_array($file['type'], $allow_type)) {
        $error = '当前文件类型不允许上传';
        return false;
    }
    # 判断文件格式
    $ext = ltrim(strrchr($file['name'], '.'), '.');
    if (!empty($allow_format) && !in_array($ext, $allow_format)) {
        $error = '当前文件格式不允许上传!';
        return false;
    }
    # 判断文件大小
    if ($file['size'] > $max_size) {
        $error = '当前上传的文件超出大小,大小为' . $max_size / 1024 . 'KB';
        return false;
    }
    # 判断是否是上传文件
    if (!is_uploaded_file($file['tmp_name'])) {
        $error = '错误:不是上传文件!';
        return false;
    }
    # 文件重命名
    $fullName = strstr($file['type'], '/', true) . '_' . date("Ymd") . "_";
    for ($i = 0; $i < 4; $i++) {
        $fullName .= chr(mt_rand(65, 90));
    }
    $fullName .= '.' . $ext;
    # 移动到指定目录
    if (move_uploaded_file($file['tmp_name'], $path . '/' . $fullName)) {
        return $fullName;
    } else {
        $error = '文件上传失败';
        return false;
    }
}

$file = $_FILES['image'];
$path = 'uploads';
$allow_type = array('image/jpg', 'image/jpeg', 'image/gif', 'image/png');
$allow_format = array('jpg', 'jpeg', 'gif', 'png');
$max_size = 8000000;

if ($filename = upload_single($file, $allow_type, $path, $error, $allow_format, $max_size)) {
    echo $filename;
} else {
    echo $error;
}

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iFulling

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值