1、文件上传原理

  1. 上传文件,就是将文件从浏览器端传到服务器端;
  2. 上传文件,必须使用<form>标记来向服务器端发数据;
  3. 上传文件,<form>标记的method属性值必须是POST;
  4. 上传文件,<form>标记的enctype属性值必须是multipart/form-data;
  5. 上传文件,必须使用<input type = ‘file' name='upload'>标记实现。

上传文件
上传文件

HTML页面代码:

<form name="form" method="post" enctype="multipart/form-data" action="./uploadFileProcedure.php">
    文件上传:<input type="file" name="uploadFile"><br>
    <input type="submit" value="提交">
    <!-- 定义一个用于上传文件页面验证的隐藏域,防止黑客攻击 -->
    <input type="hidden" name="token" value="upload">
</form>

2、超全局变量数组 $_FILES

  1. $_POST数组中保存的是普通表单元素数据;
  2. $_FILES数组中保存的是上传文件的信息。

$_FILES信息
$_FILES信息

3、上传文件错误代码

错误代码
错误代码

提示:0、1、4比较重要。

4、查看上传的临时文件位置

上传文件的默认临时目录,如果没有指定php.ini配置项upload_tmp_dir的值,则使用操作系统临时目录(c:windowstemp)。通过phpinfo()函数查看。

为什么在 c:\windows\temp 中看不到上传文件呢?因为临时文件是短暂存在的,也就是在脚本执行完毕后,就消失了。

文件路径
文件路径

5、将上传文件移动到新位置

描述:本函数检查并确保由 filename 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 destination 指定的文件。最好在临时文件没有消失前移动。

语法:

bool move_uploaded_file ( string $filename , string $destination )

参数:$filename,指定上传的临时文件名;​$destination,指定新的文件名路径;

注意:如果文件已经存在,则会覆盖操作。

注意获取的是临时文件名!
注意获取的是临时文件名!

6、上传文件的相关配置(php.ini)

  • upload_max_filesize配置:上传单个文件的大小限制,默认为2MB。
  • post_max_size配置:规定上传多个文件的总大小,默认为8MB。
  • max_file_uploads配置:规定最多上传的文件个数,默认为20个。
php.ini
php.ini
php.ini
php.ini

7、获取文件路径信息 pathinfo()

  • 描述:返回文件路径的信息 ;
  • 语法:

    mixed pathinfo ( string $path [, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ] )
  • 参数:

    • $path,要解析的路径。
    • $options,如果省略,返回全部单元;

      • PATHINFO_DIRNAME,目录名称;
      • PATHINFO_BASENAME,文件名称;
      • PATHINFO_EXTENSION,扩展名;
      • PATH_FILENAME,文件名。

8、检查数组中是否存在某个值 in_array()

  • 描述:检查数组中是否存在某个值
  • 语法:

    bool in_array ( mixed $needle , array $arr )
  • 参数:$needle检索的值,$arr原数组。

9、生成唯一ID uniqid()

  • 描述:生成一个唯一ID
  • 语法:

    string uniqid ([ string $prefix = "" [, bool $more_entropy = false ]] )
  • 参数:

    • $prefix前缀字符串,如果省略,返回字符串长度为13;
    • $more_entropy后缀字符串,如果为true,返回字符串长度为23。

uniqid()
uniqid()

实例:单个文件上传

1、上传表单制作upload.html

上传表单制作upload.html
上传表单制作upload.html

2、上传文件的程序处理upload.php

上传文件的程序处理upload.php
上传文件的程序处理upload.php
上传文件的程序处理upload.php
上传文件的程序处理upload.php

代码:

HTML页面

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>文件上传</title>
</head>

<body>
    <form name="form" method="post" enctype="multipart/form-data" action="./uploadFileProcedure.php">
        文件上传:<input type="file" name="uploadFile"><br>
        <input type="submit" value="提交">
        <!-- 定义一个用于上传文件页面验证的隐藏域,防止黑客攻击 -->
        <input type="hidden" name="token" value="upload">
    </form>

</body>

</html>

PHP程序

<?php

// 判断表单提交是否合法,防止黑客攻击
if (!(isset($_POST['token']) && $_POST['token'] == "upload")) {
    die("<h2>非法渠道上传!!!</h2>");
}

// 判断上传过程是否有错误
$uploadFile = $_FILES['uploadFile']; // 获取的数组为多维,进行减维处理
$errorCode = $uploadFile['error'];
if ($errorCode != 0) {
    die("<h2>文件上传错误,错误码:" . $errorCode . "</h2>");
}

// 判断文件大小是否超过2MB = (2 * 1024 * 1024)字节
if ($uploadFile['size'] > 2 * 1024 * 1024) {
    die("<h2>文件大小超过限制!请控制在2MB以内!</h2>");
}

// 判断上传的文件是否为图片
$imgTypeArr = ['jpg', 'webp', 'gif', 'png']; // 定义一个上传文件的所有类型数组
$imgTypeStr = implode(',', $imgTypeArr); // 将文件类型数组合并为一个字符串用于打印提示信息
$imgName = $uploadFile['name']; // 获取上传文件的文件名
$uploadFileSuffix = pathinfo($imgName, PATHINFO_EXTENSION); // 获取上传文件的文件后缀
if (!in_array($uploadFileSuffix, $imgTypeArr)) {
    die("<h2>上传的图片格式必须为:" . $imgTypeStr . "中的一种!!!</h2>");
}

// 移动临时文件到上传目录中
$imgUploadPath = "./uploads/" . uniqid() . '.' . $uploadFileSuffix; // 创建上传路径
$imgTempPath = $uploadFile['tmp_name']; // 获取windows临时存储路径
$uploadResult = move_uploaded_file($imgTempPath, $imgUploadPath); // 上传文件

// 对上传结果进行判断
if (!$uploadResult) {
    die("<h2>文件在服务器写入失败!!!</h2>");
}

实例:多个文件上传

1、制作上传表单

制作上传表单
制作上传表单

2、上传多个文件的程序处理

上传多个文件的程序处理
上传多个文件的程序处理