一、前言
众所周知,文件上传在一些网站应用中是必不可少的一部分。比如某些博客网站、论坛上传个性头像,wiki、知识网站等上传文章资料等等。
这些都涉及到使用表单处理文件上传的知识,在php中我们可以使用$_FILES这个全局数组来处理。以下本人也做了关于php上传文件的方法和$_FILES变量解析的总结归纳。
二、$_FILES变量
$_FILES是PHP的一个超全局变量,这说明这个变量在该脚本的任何作用域中都是可用的。此变量是一个数组形式,包含有所有上传的文件信息。以我们假设文件上传字段的名称如上例所示,为img。则:
(1)$_FILES['img']['name']————客户端上传的文件的原名称;
(2)$_FILES['img']['type']————文件的MIME类型,在PHP端并不会检查该类型,需要浏览器提供支持。例如“image/gif”或“image/png”;
(3)$_FILES['img']['size']————已上传文件的大小,单位为字节;
(4)$_FILES['img']['tmp_name']————文件被上传后在服务端储存的临时文件名;
(5)$_FILES['img']['error']————和该文件上传相关的错误代码。
关于$_FILES的错误码含义如下:
三、PHP文件上传步骤
上传文件功能由两个部分组成,HTML页面和PHP处理部分。HTML页面主要是让用户选择所要上传的文件,php部分让我们可以把文件存储到服务器的指定目录。1、前端HTML部分
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body>
上传文件Demo:
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="img" />
<input type="submit" name="submit" value="上传" />
</form>
</body>
</html>
说明:
(1)Input标签中type="file",表明把输入作为文件来处理。
(2)Enctype规定了在提交这个表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用"multipart/form-data",如果要上传文件,这个属性是必要的。
(3)<form>表单中也可设置一个隐藏字段限制上传最大值,避免用户上传太大文件导致长时间等待:
<input type=”hidden” name=”MAX_FILE_SIZE” value=”字节数” />;
其中MAX_FILE_SIZE的值必须小于php.ini中的最大上传大小。
2、后端PHP部分
后端获取前端上传的文件就是通过$_FILES变量,而后端需要做的就是将上传的这个在临时位置的文件保存到服务器某个指定目录下(move_uploaded_file方法),当然在此之前可以先做一下文件类型、大小等的判断。
步骤:
①判断文件是否成功上传:is_uploaded_file($_FILES[‘img’][‘tmp_name’]);is_uploaded_file()函数可以判断文件是否是通过HTTP POST上传的。若是,文件会保存在临时目录下。
②判断文件目录是否存在:多定义常量来表示路径,不存在的则创建;
③判断文件格式是否合法:可通过判断文件后缀名,将其存在数组中用in_array()函数来判断;
④保存临时文件到指定目录,PHP提供了一个叫move_uploaded_file的方法,用法如下:
bool move_uploaded_file ( string
$filename
,
string $destination
)
注:move_uploaded_file方法相比于直接的copy操作,会多了一步检查工作,确保文件是否合法(即通过 PHP 的 HTTP POST 上传机制所上传的)。
3、具体实现
<?php
if($_FILES['img']['name']!=''){
if($_FILES['img']['error']>0){
switch($_FILES['img']['error']){
case 1:
echo "文件大小超过了PHP.ini中的文件限制!";
break;
case 2:
echo "文件大小超过了浏览器限制!";
break;
case 3:
echo "文件部分被上传!";
break;
case 4:
echo "没有找到要上传的文件!";
break;
case 5:
echo "服务器临时文件夹丢失,请重新上传!";
break;
case 6:
echo "文件写入到临时文件夹出错!";
break;
}
}else{
if($_FILES['img']['type']=='image/jpeg' or $_FILES['img']['type']=='image/pjpeg' or $_FILES['img']['type']=='image/gif'&&$_FILES['img']['size']<20480){
if(!file_exists("uploads/".$_FILES["img"]["name"])){
if(move_uploaded_file($_FILES['img']['tmp_name'],"uploads/".$_FILES['img']['name'])){
echo "<script>alert('上传成功!');</script>";
}else{
echo "<script>alert('文件上传失败!');</script>";
}
}else{
echo "<script>alert('您上传的文件已经存在!');</script>";
}
}else{
echo "<script>alert('请上传小于2MB的jpeg或Gif类型的附件');</script>";
}
}
}else{
echo "<script>alert('请上传文件!');</script>";
}
?>
四、php.ini中关于文件上传的设置指令
①file_uploads=on;是否允许通过HTTP上传文件的开关。默认为ON即是开②upload_tmp_dir;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
③upload_max_filesize=8m;即允许上传文件大小的最大值。默认为2M
④post_max_size=8m;指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M
通过以上配置就可以实现限制PHP上传文件的大小了,注意一般来说 upload_max_filesize = post_max_size > 表单的MAX_FILE_SIZE
如果需要上传大文件,必须设置另外的PHP页面执行时间、最大运行内存等等参数:
max_execution_time=600;每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time =600;每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit=8m;每个PHP页面所占用的最大内存,默认8M