单文件上传
使用表单可以进行文件上传,在使用时,需要设置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>
PHP会将从表单中接收到的数据保存在超全局数组$_POST中,但是使用$_POST接收到的文件信息仅包含文件的名称。对于从表单中接收到的上传文件,服务器会将其保存在服务器默认的上传文件临时目录中,我们可以使用超全局变量$_FILES来获取临时文件中的信息。$_FILES数组中保存了文件的5个信息,具体如下。
- name:客户端文件的原名称。
- type:文件的MIME类型,需要浏览器提供该信息的支持,如“image/gif”。
- size:上传文件的大小,单位为字节。
- tmp_name:文件被上传后在服务端储存的临时文件名,一般是系统默认,可以在php.ini的upload_tmp_dir指定。
- error:文件上传相关的错误代码,具体含义如表1所示。
表1 文件上传错误代码
代码 | 常量 | 说明 |
---|---|---|
0 | UPLOAD_ERR_OK | 没有错误发生,文件上传成功 |
1 | UPLOAD_ERR_INI_SIZE | 上传的文件超过了php.ini中upload_max_filesize 选项限制的值 |
2 | UPLOAD_ERR_FORM_SIZE | 上传文件的大小超过了HTML表单中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()函数将临时文件保存到指定的目录中。