首页 > 编程笔记 > PHP笔记 阅读:18

PHP单文件上传和多文件上传(附带实例)

使用表单可以进行文件上传,需要给 <form> 标签设置 enctype 属性。

enctype 属性用于指定表单数据的编码方式,默认值为 application/x-www-form-urlencoded,如果要实现文件上传,需要将其设置为 multipart/form-data。示例代码如下:
<form action="表单提交地址" method="POST" enctype="multipart/form-data">
  <input type="file" name="file">
  <input type="submit" value="上传">
</form>
使用 $_POST 接收上传的文件,信息仅包含文件的名称,如果想要获取文件的详细信息,需要使用 $_FILES 超全局变量来获取。$_FILES 数组中保存了文件的 6 个信息,具体如下:
表:文件上传相关的错误代码
代码 常量 说明
0 UPLOAD_ERR_OK 没有错误发生,文件上传成功
1 UPLOAD_ERR_INI_SIZE 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值
2 UPLOAD_ERR_FORM_SIZE 上传的文件大小超过了表单中 MAX_FILE_SIZE 选项指定的值
3 UPLOAD_ERR_PARTIAL 只有部分文件被上传
4 UPLOAD_ERR_NO_FILE 没有文件被上传
6 UPLOAD_ERR_NO_TMP_DIR 找不到临时目录
7 UPLOAD_ERR_CANT_WRITE 文件写入失败

文件上传后,就会被服务器自动保存在临时目录中,文件的保存期限为 PHP 脚本的执行周期,当 PHP 脚本执行结束后,文件就会被释放。如果想将文件永久保存下来,需要使用 PHP 提供的 move_uploaded_file() 函数将文件保存到指定的目录中。

将文件从临时目录保存到指定目录的示例代码如下:
if (isset($_FILES['upload'])) {
    if ($_FILES['upload']['error'] !== UPLOAD_ERR_OK) {
        exit('上传失败!');
    }
    $save = './uploads/' . time() . '.dat';
    if (!move_uploaded_file($_FILES['upload']['tmp_name'], $save)) {
        exit('上传失败,无法将文件保存到指定位置!');
    }
    echo '上传成功!';
}
在上述示例代码中,第 5 行代码利用时间戳自动生成文件名,而不是直接保存原文件名。这种方式可以防止浏览器提交非法的文件名造成程序出错,也能防止浏览器提交“.php”扩展名的文件造成恶意脚本执行。第 6 行代码使用 move_uploaded_file() 函数将临时文件保存到指定的目录中。

PHP多文件上传

多文件上传是指一次性上传多个文件,上传的文件属于同一类文件,示例代码如下:
<form action="表单提交地址" method="post" enctype="multipart/form-data">
  个人相册:
  <input type="file" name="photo[]">
  <input type="file" name="photo[]">
  <input type="file" name="photo[]">
  <input type="submit" value="上传">
</form>
在上述示例代码中,文件上传按钮的 name 属性采用数组的命名方式,表示上传多个文件。

用 PHP 处理多文件上传时,使用 $_FILES 接收上传的文件的信息,利用循环处理文件信息,示例代码如下:
$len = count($_FILES['photo']['name']);
for ($i = 0; $i < $len; $i++) {
    $file = [    
        'name' => $_FILES['photo']['name'][$i],
        'type' => $_FILES['photo']['type'][$i],
        'tmp_name' => $_FILES['photo']['tmp_name'][$i],
        'error' => $_FILES['photo']['error'][$i],
        'size' => $_FILES['photo']['size'][$i]
    ];
}
在上述示例代码中,通过 for 语句获取上传的文件信息,并将其保存到指定目录中。

相关文章