0.上传单张图片
用户通过表单将文件上传到服务器,我们先来看下表单结构:
<form method='post' action='test.php' enctype='multipart/form-data'>
<input type='file' name='fn'><br><br>
<input type='submit' value="上传">
</form>
这里使用了含文件上传控件的表单,必须将form
标签的enctype
属性设置为multipart/form-data
。通过点击选择文件按钮在本地选择单个待上传文件,点击上传按钮,即会由`test.php'来处理。
下面是上传一个单文件的完整代码:
test.php
<?php
echo <<<_END
<form method='post' action='test.php' enctype='multipart/form-data'>
<input type='file' name='fn'><br><br>
<input type='submit' value="上传">
</form>
_END;
if($_FILES){
$n = $_FILES['fn']['name'];
move_uploaded_file($_FILES['fn']['tmp_name'],$n);
}
?>
这里表单也是通过php文件输出,如果操作成功,将会在test.php所在目录看到之前上传的文件。
要想弄懂代码含义,还需要弄明白$_FILES
这个数组,在移动文件move_upload_file()
之前,我们先用print_r()
观察一下数组内容。
echo '<pre>';
print_r($_FILES);
echo '</pre>';
上传文件后,我们将会看到页面输出了以下内容:
想必你已经发现了,'fn'即是之前表单中
type
属性设置为file
的input标签的name
值。
数组元素 | 内容含义 |
---|---|
$_FILES['fn']['name'] | 上传文件的名字 |
$_FILES['fn']['type'] | 上传文件的类型 |
$_FILES['fn']['tmp_name'] | 存储在服务器上的临时文件名 |
$_FILES['fn']['error'] | 上传文件导致的错误代码 |
$_FILES['fn']['size'] | 上传文件的大小(单位为字节) |
现在再来看下这个if语句:
if($_FILES){
$n = $_FILES['fn']['name'];
move_uploaded_file($_FILES['fn']['tmp_name'],$n);
}
当没有上传文件的时候,尝试用print_r()
输出$_FILES只会得到一个空数组,即在上面的代码中,如果没有文件上传,将不会进入if语句内。然后我们使用move_uploaded_file()
函数将临时文件保存到了指定目录下。
1.多文件上传
上面的例子中,选中了一个文件就不允许继续选择其他文件,有时候我们想一次上传多个文件,只需对此input
按钮稍作改动:
<input type="file" name="fn[]" multiple="multiple">
//也可以简写为:<input type="file" name="fn[]" multiple>
- name设置的值后加上一个中括号
[]
。 - 设置multiple属性的值为
multiple
。
多文件上传后再试试用print_r()
打印$_FILES:
这里我上传了三张图片。
2.文件验证
用户上传什么类型的文件至服务器是不可预测的,因此非常有必要对文件进行一个简单的验证:
foreach($_FILES['pics']['type'] as $key=>$value)
{
switch ($value)
{
case 'image/jpeg': $ext = 'jpg'; break;
case 'image/png': $ext = 'png'; break;
case 'image/gif': $ext = 'gif'; break;
default: $ext = ''; break;
}
if($ext)
{
//将执行的操作
}
如果上传的文件类型符合要求才会进入if语句执行接下来的操作。
3.多文件上传并验证的实例
完整代码如下:(含选择图片后的网页预览)
<?php
echo <<<_END
<form method="post" action="" enctype="multipart/form-data">
<input type="file" name="fn[]" multiple>
<input type="submit" value="提交">
</form>
_END;
if($_FILES) {
foreach($_FILES['fn']['type'] as $key=>$value)
{
switch ($value)
{
case 'image/jpeg': $ext = 'jpg'; break;
case 'image/png': $ext = 'png'; break;
case 'image/gif': $ext = 'gif'; break;
default: $ext = ''; break;
}
if($ext)
{
//名称从0开始
$name = "$key.$ext";
move_uploaded_file($_FILES['fn']['tmp_name'][$key], $name);
echo "<img src =$name>";
}
}
}
?>