之前我记得写过一个图片上传的文章,但是图片和文件区别也是很大的,文件必须保证上传的类型必须符合要求,否则将会导致网站异常,攻击等,比如你没有判断别人上传的文件类型,那别人直接上传一个php的木马,直接放一个webshell在你的网站,遍历目录,获取你的网站源代码等等。
所以对于文件上传的要求是很高的。接下来我讲述一个简单的文件上传方法。
我在这里允许上传的后缀为 txt、zip、rar这三种文件类型。
最大上传大小为2024kb(2M),php.ini配置文件中默认就是2m
做文件上传一般都是判断文件是否存在,文件保存目录是否存在,文件上传目录是否有权限,文件是否超过最大大小限制,是否是通过https方式上传,文件上传后缀(类型)是否被允许这几种常规上传规则。
首先html我们使用框架上传,这样更好一点,php是没法异步上传的,框架上传也是一种不错的方法。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>【七空幻音】PHP简单文件上传</title>
</head>
<body>
<form action="file.php" method="post" enctype="multipart/form-data" target="upfile_iframe">
<input type="submit" name="submit" value="上传">
</form>
<iframe src="file.php" width="0" height="0" style="display:none;" name="upfile_iframe"></iframe>
</body>
</html>
php上传的要求是post方法,enctype="multipart/form-data" 属性。
为了方便上传再加上一个框架,让上传图片在这个框架上传,所以给表单加上一个target指向这个框架就行了。框架再隐藏即可。
上传处理文件
<?php
//文件上传 txt rar zip
header("Content-type: text/html; charset=utf-8");
//允许的文件类型
$allowSuffix = array('txt','rar','zip');
//最大上传大小(KB)
$sizeMax = 2024;
if(isset($_FILES['upfile'])){
$file = $_FILES['upfile'];
$size = $file['size'];
$name = $file['name'];
$error = $file['error'];
//判断文件是否上传
if(!$name){
alert("请选择文件");
}
//判断这个目录是否存在
if(!is_dir("upload")){
alert("文件保存目录不存在");
}
//判断是否有这个目录写的权限
if (@is_writable("upload") === false) {
alert("上传目录没有写权限");
}
if($size/1024>$sizeMax){
alert("文件大小超过最大限制");
}
if(!is_uploaded_file($_FILES['upfile']['tmp_name'])) {
alert("上传失败");
}
//检查是否运行这个后缀的上传
if(!in_array(get_suffix($name),$allowSuffix)){
alert("这个类型不允许上传");
}
$filePath = "upload/".file_rename($name);
if(move_uploaded_file($file['tmp_name'],$filePath)){
alert("上传成功:文件路径:".$filePath);
}else{
alert("移动文件失败");
}
}
//提示用户并终止程序
function alert($msg){
exit("<script>alert('".$msg."')</script>");
}
//获取文件的后缀
function get_suffix($fileName){
$file_end = explode('.',$fileName);
return $file_end[count($file_end)-1];
}
//获取文件名称(不含后缀)
function get_file_name($fileName){
$file_end = explode('.',$fileName);
$name = '';
for($i=0;$i<count($file_end);$i++){
if($i!=count($file_end)-1){
$name.=$file_end[$i];
}
}
return $name;
}
//生成新的名称(存在则随机生一个数字,如果还存在则递归生成)
function file_rename($name){
$fileName = get_file_name($name).'-'.date("YmdHis",time()).'.'.get_suffix($name);
if(file_exists("upload/".$fileName)){
$tmpName = get_file_name($name).'-'.date("YmdHis",time()).'-'.rand(0,9).'.'.get_suffix($name);
if(file_exists("upload/".$tmpName)){
file_rename($name);
}else{
return $tmpName;
}
}else{
return $fileName;
}
}
?>
Demo下载地址:
0条评论登录后可见