PHP上传原理及实现
1、Form标签enctype属性
表单中enctype="multipart/form-data"是用于设置表单的MIME编码。
默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;
只有使用了multipart/form-data且提交方式为Post才能完整的传递文件数据。
2、MAX_FILE_SIZE 隐藏字段
MAX_FILE_SIZE 隐藏字段(单位为字节)必须放在文件输入字段之前,其值为接收文件的最大尺寸。这是对浏览器的一个建议,PHP 也会检查此项。
在浏览器端可以简单绕过此设置,因此不要指望用此特性来阻挡大文件。(不过鉴于友好性最好还是在表单中加上此项目,因为它可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦。)
//upload.php print_r($_FILES);?>Array(
[file] => Array
(
[name] => image.jpg
[type] => image/jpeg
[tmp_name] => F:\wamp\tmp\php41BB.tmp
[error] => 0
[size] => 73886
)
)
3、全局变量 $_FILES的应用
$_FILES['file']['name']; //为上传文件的原文件名
$_FILES['file']['type']; //为上传文件的 MIME 类型
$_FILES['file']['size']; //已上传文件的大小,单位为字节
$_FILES['file']['tmp_name']; //文件被上传后在服务端储存的临时文件名()
$_FILES['file']['error']; //文件上传的错误代码
4、默认情况下,上传文件会保存在服务端的临时文件夹中,其目录在php.ini中设置
php.ini与文件上传有关的一些常用设置:
file_uploads ; //是否允许通过HTTP上传文件的开关。默认为ON即是开upload_tmp_dir ; //文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹upload_max_filesize; //即允许上传文件大小的最大值。默认为2Mpost_max_size; //指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M
简单的代码:
//取得上传文件信息
$fileName=$_FILES['file']['name']; $fileType=$_FILES['file']['type']; $fileError=$_FILES['file']['error']; $fileSize=$_FILES['file']['size']; $tempName=$_FILES['file']['tmp_name'];//临时文件名
//定义上传文件类型
$typeList = array("image/jpeg","image/jpg","image/png","image/gif"); //定义允许的类型
if($fileError>0){ //上传文件错误编号判断
switch ($fileError) { case 1: $message="上传的文件超过了php.ini 中 upload_max_filesize 选项限制的值。";
break; case 2: $message="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。";
break; case 3: $message="文件只有部分被上传。";
break; case 4: $message="没有文件被上传。"; break; case 6: $message="找不到临时文件夹。";
break; case 7: $message="文件写入失败";
break; case 8: $message="由于PHP的扩展程序中断了文件上传"; break;
} exit("文件上传失败:".$message);
} if(!is_uploaded_file($tempName)){ //判断是否是POST上传过来的文件
exit("不是通过HTTP POST方式上传上来的");
}else{ if(!in_array($fileType, $typeList)){ exit("上传的文件不是指定类型");
}else{ if(!getimagesize($tempName)){ //避免用户上传恶意文件,如把病毒文件扩展名改为图片格式
exit("上传的文件不是图片");
}
} if($fileSize>100000){ //对特定表单的上传文件限制大小
exit("上传文件超出限制大小");
}else{ //避免上传文件的中文名乱码
$fileName=iconv("UTF-8", "GBK", $fileName);//把iconv抓取到的字符编码从utf-8转为gbk输出
$fileName=str_replace(".", time().".", $fileName);//在图片名称后加入时间戳,避免重名文件覆盖
if(move_uploaded_file($tempName, "uploads/".$fileName)){ echo "上传文件成功!";
}else{ echo "上传文件失败";
}
}
}?>
5、关于php上传文件的一些常用函数:
file_exists() //检查文件或目录是否存在is_uploaded_file() //判断文件是否是通过 HTTP POST 上传的move_uploaded_file() //将上传的文件移动到新位置is_writable() //判断给定的文件名是否可写iconv() //字符编码互转str_replace() //字符串替换(更改文件名,防重名)getimagesize() //检查是否为图片文件(其他类型的文件就算后缀名改了也能被检测到)
上一篇: python函数和常用模块的详细介绍