文件的上传包括单文件上传和多文件上传
PHP配置php.ini文件
开启文件上传 file_uploads=On;
设置临时目录 upload_tmp_dir=;
上传文件大小的限制 upload_max_size=10M
上传文件的数量的限制 max_file_uploads=20;
post方式提交的最大数据限制(一般大于upload_max_filesize) post_max_size=20M;
通过表单提交的方式上传文件
1.请求方式必须是post
2.需要用到input type=file
3.设置属性 enctype="multipart/form-data"(只有文件上传时用)
添加一个隐藏的input type=hidden MAX_FILE_SIZE 值是字节数
$_POST 接受表单信息
$_FILES 接收文件信息
is_uploaded_file($filename) 检测是否是上传文件
move_uploaded_file(des) 移动文件从原路径到新路径
临时路径
/*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 引进。
Note:
以上值在 PHP 4.3.0 之后变成了 PHP 常量。
第一种:单文件上传
HTML
<form action="0fileupload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="10000000">
文件上传:<input type="file" name="pic">
<input type="submit" value="文件上传">
</form>
PHP
查看post方式提交过来的$_FILES
array(1) {
["pic"]=>
array(5) {
["name"]=>
string(8) "preg.png"
["type"]=>
string(9) "image/png" MIME类型
["tmp_name"]=>
string(41) "D:\wampstack-5.6.19-0\php\tmp\phpE8DC.tmp"
["error"]=> 整型表示
int(0)
["size"]=>
int(180823)
}
}
if(isset($_FILES['pic'])){
$file_info=$_FILES['pic'];
// 第一步,错误限制
// error=0 表示没有错误 error>0 表示出错
if($file_info['error']>0){
$error_no=$file_info['error'];
switch ($error_no){
case UPLOAD_ERR_INI_SIZE:
echo "文件太大,超出配置范围大小";
break;
case UPLOAD_ERR_FORM_SIZE:
echo "文件太大,超出表单范围大小";
break;
case UPLOAD_ERR_PARTIAL:
echo "文件只是部分上传,没有上传完全部";
break;
case UPLOAD_ERR_NO_FILE:
echo "没有文件被上传";
break;
default:
echo "未知错误";
break;
}
exit;
}
// 第二步:大小限制
$file_size=$file_info['size'];
$max_size=5000000;
if($file_size>$max_size){
echo "文件超出最大限制";
exit;
}
// 第三步:类型限制
$file_type=$file_info['type'];
$file_type=end(explode('/',$file_type)); //end()返回数组中最后一个元素的值
// 得到类型是MIME类型 image/png image/jpg等
$mimeTypes=['png','jpeg','jpg','gif'];
if(!in_array($file_type,$mimeTypes)){
echo "类型不允许";
exit;
}
// 处理上传文件目录
$upload_dir='./upload';
if(!file_exists($upload_dir)){
mkdir($upload_dir);
}
// 处理一个唯一的文件名,可以用 时间戳+随机数
$file_name=time().mt_rand(1,999).'.'.$file_type;
// 处理完整的文件路径
$file_path=$upload_dir.DIRECTORY_SEPARATOR.$file_name;
// 处理文件
$tmp_path=$_FILES['pic']['tmp_name'];//临时路径
// 临时文件会在PHP代码执行完毕后自动清除
if(is_uploaded_file($tmp_path)){ //检测是否是上传文件
if(move_uploaded_file($tmp_path,$file_path)){ //移动原路径到新路径
echo "成功";
} else{
echo "失败";
}
}else{
echo "这不是一个上传文件";
}
}
错误代码
UPLOAD_ERR_INI_SIZE 常量 值:1 表示上传的文件大小超过了php.ini中设置的值upload_max_filesize
UPLOAD_ERR_FORM_SIZE 常量 值:2 表示上传的文件大小超过了表单中设置的MAX_FILE_SIZE
UPLOAD_ERR_PARTIAL 值:3 表示文件只是部分上传,没有上传完全部
UPLOAD_ERR_NO_FILE 值:4 表示没有文件被上传
第二种:多文件上传,将name改成数组形式的名字
<form action="2fileupload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="10000000">
多文件上传:<input type="file" name="pic[]"><br>
多文件上传:<input type="file" name="pic[]"><br>
多文件上传:<input type="file" name="pic[]"><br>
<input type="submit" value="文件上传">
</form>
if(isset($_FILES['pic'])){
$info=$_FILES['pic'];
$arrs=array();
// 将数据信息按照名称分类;
foreach ($info as $key=>$value){
// key:name type size error tmp_name
// value:array(0:value1;1:value2...),array()...
if(is_array($value)){
$i=0;
/* while (list($attr_key,$attr_value)=each($value)){
$arrs[$i][$key]=$attr_value;
$i++;
} 与foreach等价*/
foreach ($value as $attr_key=>$attr_value){
// attr_key:0,1,2..
// attr_value:val1,val2..
$arrs[$i][$key]=$attr_value;
$i++;
}
}
}
foreach ($arrs as $file_info){
echo "<pre>";
var_dump($arrs);
var_dump($file_info);
echo "</pre>";
verify_upload($file_info);
}
}
//验证上传信息
function verify_upload($file_info){
// 第一步,错误限制
// error=0 表示没有错误 error>0 表示出错
if($file_info['error']>0){
$error_no=$file_info['error'];
switch ($error_no){
case UPLOAD_ERR_INI_SIZE:
echo "文件太大,超出配置范围大小<br>";
break;
case UPLOAD_ERR_FORM_SIZE:
echo "文件太大,超出表单范围大小<br>";
break;
case UPLOAD_ERR_PARTIAL:
echo "文件只是部分上传,没有上传完全部<br>";
break;
case UPLOAD_ERR_NO_FILE:
echo "没有文件被上传<br>";
break;
default:
echo "未知错误<br>";
break;
}
return;
}
// 第二步:大小限制
$file_size=$file_info['size'];
$max_size=5000000;
if($file_size>$max_size){
echo "文件超出最大限制<br>";
return;
}
// 第三步:类型限制
$file_type=$file_info['type'];
$file_type=end(explode('/',$file_type)); //end()返回数组中最后一个元素的值
// 得到类型是MIME类型 image/png image/jpg等
$mimeTypes=['png','jpeg','jpg','gif'];
if(!in_array($file_type,$mimeTypes)){
echo "类型不允许<br>";
return;
}
// 处理上传文件
$upload_dir='./upload';
if(!file_exists($upload_dir)){
mkdir($upload_dir);
}
// 处理一个唯一的文件名,可以用 时间戳+随机数
$file_name=time().mt_rand(1,999).'.'.$file_type;
// 处理完整的文件路径
$file_path=$upload_dir.DIRECTORY_SEPARATOR.$file_name;
// 处理文件
$tmp_path=$file_info['tmp_name'];//临时路径
// 临时文件会在PHP代码执行完毕后自动清除
if(is_uploaded_file($tmp_path)){ //检测是否是上传文件
if(move_uploaded_file($tmp_path,$file_path)){ //移动原路径到新路径
echo "成功<br>";
} else{
echo "失败<br>";
}
}else{
echo "这不是一个上传文件<br>";
}
}