在PHP中支持<span style="color:red;">form</span>表单的文件上传提交处理,只是要把form表单设置成post方式提交,添加<span style="color:red;">enctype="multipart/form-data"</span>属性即可。PHP默认有个文件上传大小限制,具体可以用<span style="color:red;">phpinfo()</span>查看<span style="color:red;">upload_max_filesize</span>值即是。默认是<span style="color:red;">2M</span>,当然这个值可以改,但要注意配合<span style="color:red;">post_max_size</span>的值。
PHP有一个全局函数<span style="color:red;">$_fifles</span>用于接收表单提交过来的文件信息,信息是一个数组,分别有五个属性,分别是
<span style="color:red;">[name]</span> 文件名属性 , 即文件名
<span style="color:red;">[tmp_name]</span> 临时文件属性, 临时文件,这个临时文件就是上传过来的真实文件
<span style="color:red;">[error]</span> 错误属性,是否有错误,如果为0代表无错误
<span style="color:red;">[size]</span> 大小属性,单位是字节,通过这个属性我们可以文件大小进行限制
<span style="color:red;">[type]</span> 类型属性,通过这个属性我们可以限制上传类型
但这个类新属性是根据文件拓展名而来的,可靠性不高。最好根据<span style="color:red;">mime</span>判断文件类型,文中我判断文件类型使用<span style="color:red;">mime_content_type()</span>函数,使用<span style="color:red;">mime_content_type()</span>函数判断上传的文件类型可以有效防止用户更改文件后缀名达到骗取程序效果。比如你有一个文本文件<span style="color:red;">a.txt</span>,你把文件名修改成<span style="color:red;">a.rar</span>可能在你的电脑上图标已经改变成压缩包的形式。但你上传后通过<span style="color:red;">mime_content_type()</span>函数依然能检测出文件是text类型。
示例中上传的方法为普通上传,意思就是文件先上传到服务器上,然后服务器在判断文件的大小类型等等,这是普通上传的一个弊端。由于js的安全性问题导致js在处理文件上不能做到前端验证,所以需要前端判断目前最好的方式是通过flash来做前端判断,下次我再详细介绍使用flash方式上传文件
upload.html页面代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- 此行定义字符集,在使用汉字的国家,字符集通常有 gb2312,utf-8两种字符集,设置不对会导致页面中文乱码
因为我的编辑器是utf-8的,所以这里我定义字符集为utf-8。如果你的字符集是gb2312可以修改charset值 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- 此行多是IE浏览器不兼容导致的,现在IE6,IE7使用的人数不多了,大多数可以忽略 -->
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<!-- 定义文档标题 -->
<title>PHP上传实例</title>
<!-- 加入js脚本,简单的前端判断,防止没有选择上传文件就点击提交 -->
<script type="text/javascript">
// 当页面加载完后执行里边的函数体
// 因为页面的加载顺序是自上到下,否则你把JS移到页脚也可以
window.onload = function(){
// 给上传按钮添加鼠标单击事件
document.forms[0].elements[1].onclick = function(){
// 判断要上传的文件名是否为空
if( document.forms[0].file.value == '' ){
// 如果是空则弹出警告
alert('请先选择文件');
// 结束脚本运行
return;
}
// 如果文件不为空则上传文件
document.forms[0].submit();
}
}
</script>
</head>
<body>
<!-- 此行是定义form表单区域,上传文件必须用POST方式,还要添加 enctype="multipart/form-data" 属性
action里的值为你要处理上传文件的页面,也可以用url或者相对路径 -->
<form action="upload.php" method="post" enctype="multipart/form-data">
<!-- 定义选择文件的浏览表单 value属性里值就是显示在按钮上的值 -->
<input type="file" name="file" value="选择要上传的文件" />
<!-- 定义提交到服务器的按钮 value属性里的值就是显示在按钮上的值 -->
<input type="button" value="上传" />
</form>
</body>
</html>
<br />
upload.php页面代码
<?php
/**
* PHP文件上传处理页面
* 琼台博客
*/
// 定义提示函数
function alert($msg){
return '<script type="text/javascript">alert("'.$msg.'");window.history.back(-1);</script>';
}
// 定义允许的文件类型
$allowType = array('image/jpeg','image/gif','image/jpg');
// 定义路径,可以是绝对路径,或者相对路径都可以
$filePath = './uploadFileDir/';
// 接收表单信息 其中里边写的 file 值是 静态页form表单里的name值
$file = $_FILES['file'];
// 第一步,判断上传的文件是否有错误
if( $file['error'] !== 0 ){
exit(alert('文件上传错误'));
}
// 第二步,判断文件大小,这里的102400是字节,换算为kb就是100kb
if( $file['size'] > 102400 ){
exit(alert('文件过大'));
}
// 第三步,判断文件类型
if( !in_array(mime_content_type($file['tmp_name']),$allowType) ){
exit(alert('文件类型错误'));
}
// 第四步,判断路径是否存在,如果不存在则创建
if( !file_exists($filePath) && !mkdir($filePath,0777,true) ){
exit(alert('创建目录错误'));
}
// 第五步,定义上传后的名字及路径
$filename = time().'_'.$file['name'];
// 第六步,复制文件
if( !copy($file['tmp_name'],$filePath.$filename) ){
exit(alert('上传文件出错,请稍候重试'));
}
// 第七步,删除临时文件
unlink($file['tmp_name']);
// 提示上传成功
echo alert('恭喜,上传文件['.$filename.']成功!'); |