PHP单文件上传和多文件上传(附带实例)
使用表单可以进行文件上传,需要给 <form> 标签设置 enctype 属性。
enctype 属性用于指定表单数据的编码方式,默认值为 application/x-www-form-urlencoded,如果要实现文件上传,需要将其设置为 multipart/form-data。示例代码如下:
文件上传后,就会被服务器自动保存在临时目录中,文件的保存期限为 PHP 脚本的执行周期,当 PHP 脚本执行结束后,文件就会被释放。如果想将文件永久保存下来,需要使用 PHP 提供的 move_uploaded_file() 函数将文件保存到指定的目录中。
将文件从临时目录保存到指定目录的示例代码如下:
用 PHP 处理多文件上传时,使用 $_FILES 接收上传的文件的信息,利用循环处理文件信息,示例代码如下:
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 个信息,具体如下:
- name:通过浏览器上传的文件的原名称;
- type:文件的 MIME 类型,如 image/gif;
- size:上传文件的大小,单位为字节;
- tmp_name:文件被上传后存储在服务器端的临时文件名,一般为系统默认名,可以在 php.ini 的 upload_tmp_dir 中指定;
- full_path:浏览器提交的完整路径。该值并不总是包含真实的目录结构,因此不能被信任;
- error:文件上传相关的错误代码,具体含义如下表所示。
代码 | 常量 | 说明 |
---|---|---|
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 语句获取上传的文件信息,并将其保存到指定目录中。