在上一节中学习了
$_FILES
的基本使用,本节将继续学习它的进阶用法:文件的上传与 校验
1、创建上传表单
<form method="post" action="file.php" enctype="multipart/form-data">
<label for="file"></label>
<input type="file" name="file" id="file">
<input type="submit" value="提交">
</form>
说明:
<form>
标签的enctype
属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 “multipart/form-data”。<input>
标签的type="file"
属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。
2、创建上传脚本
<?php
if ($_FILES["file"]["error"] > 0){
echo "错误:" . $_FILES["file"]["error"] . "<br>";
}else{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
}
?>
说明:以上语法第一个参数是表单中input的
name
,第二个参数为文件上传属性,具体参数见下表
第二参数详解
参数 | 释义 |
---|---|
name | 上传文件的名称 |
type | 上传文件的类型 |
size | 上传文件的大小,以字节(B)计算 |
tmp_name | 文件被上传后在服务端储存的临时文件名,一般是系统默认 |
error | 该文件上传相关的错误代码。 PHP 4.2.0 版本中增加,PHP4.3之后变成常量 |
error错误类型和值
错误类型 | 值 - 说明 |
---|---|
UPLOAD_ERR_OK | 0 。没有错误发生,文件上传成功 |
UPLOAD_ERR_INI_SIZE | 1 。上传的文件超过了 php.ini 中 upload_max_filesize选项限制的值 |
UPLOAD_ERR_FORM_SIZE | 2 。上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值 |
UPLOAD_ERR_PARTIAL | 3 。文件只有部分被上传 |
UPLOAD_ERR_NO_FILE | 4 。文件没有被上传 |
UPLOAD_ERR_NO_TMP_DIR | 6 。找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进 |
UPLOAD_ERR_CANT_WRITE | 7 。文件写入失败。PHP 5.1.0 引进 |
3、对上传文件进行限制
<?php
//设置允许用户上传的文件类型
$allowExts = array('jpg','jpeg','gif','png');
//使用explode()语法将文件名分成两段
$fenge = explode('.',$_FILES['file']['name']);
//取出文件名后缀
$exts = end($fenge);
//如果文件后缀名在允许数组内,就允许上传
if(in_array($exts,$allowExts)){
//若上传成功,打印文件信息,若上传失败,则抛出错误信息
if ($_FILES["file"]["error"] > 0) {
echo $_FILES["file"]["error"] . '<br> ';
} else {
echo '文件名:' . $_FILES["file"]["name"] . '<br>' .
'文件类型:' . $_FILES["file"]["type"] . '<br>' .
"文件临时存储的名字: " . $_FILES["file"]["tmp_name"] . '<br>' .
'文件大小:' . ($_FILES["file"]["size"] / 1024) . 'kbyte<br>';
}
}else{//如果文件后缀名不符合规定,则给出提示
echo "错误的文件格式";
}
4、对上传的文件进行保存
__注意:__文件被上传结束后,默认地被存储在了临时目录中,这时您必须将它从临时目录中删除或移动到其它地方,如果没有,不管是否上传成功,脚本执行完后临时目录里的文件肯定会被删除。所以在删除之前要用PHP的
copy()
或者move_uploaded_file()
将它复制或移动到其它位置,此时,才算完成了上传文件过程。
<?php
//设置允许用户上传的文件类型
$allowExts = array('jpg','jpeg','gif','png');
//使用explode()语法将文件名分成两段
$fenge = explode('.',$_FILES['file']['name']);
//取出文件名后缀
$exts = end($fenge);
//如果文件后缀名在允许数组内,就允许上传
if(in_array($exts,$allowExts)){
//若上传成功,打印文件信息,若上传失败,则抛出错误信息
if ($_FILES["file"]["error"] > 0) {
echo $_FILES["file"]["error"] . '<br> ';
} else {//上传成功,执行
echo '文件名:' . $_FILES["file"]["name"] . '<br>' .
'文件类型:' . $_FILES["file"]["type"] . '<br>' .
"文件临时存储的名字: " . $_FILES["file"]["tmp_name"] . '<br>' .
'文件大小:' . ($_FILES["file"]["size"] / 1024) . 'kbyte<br>';
//检查文件是否存在
if (file_exists("cunchu/" . $_FILES["file"]["name"])) {
echo $_FILES["file"]["name"] . '文件已存在<br>';
} else {//若不存在,则将临时文件移动到存储位置
move_uploaded_file($_FILES["file"]["tmp_name"], 'cunchu/' . $_FILES["file"]["name"]);
}
}
}else{//如果文件后缀名不符合规定,则给出提示
echo "错误的文件格式";
}
用法:
move_uploaded_file(file,newloc)
若移动成功,返回true,否则返回false
参数说明:
file
需要移动的文件newloc
文件的新位置
到此,文件才算上传完成。允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作并对上传文件进行严格校验。