在网站开发的过程中,为了确保充分地利用服务器的空间,在开发上传功能时最好能够对上传文件的大小进行控制。本例开发的上传功能就可以对上传文件的大小进行控制。如果上传文件的大小超过指定范困,那么将给出提示信息,并终止上传。运行结果如图11.22所示。
图11.22 限制上传文件大小
【操作步骤】
第1步,创建index.php文件。为index.php文件添加表单,设置enctype属性值为"multipart/form-data",添加文件域,用POST方法将表单中数据提交到本页。
<form action="" method="post" enctype="multipart/form-data"> <p>选择上传文件:<input type="file" name="up_picture"> <input type="hidden" name="MAX_FILE_SIZE" value="10"> </p> <p>上传文件大小为(2M)</p> <p><input type="reset" value="重置"> <input type="submit" value="提交"></p> </form>
第2步,通过S_FILES获取上传文件的相关信息,通过move_uploaded_file()函数完成图片的上传。
<?php if(!empty($_FILES['up_picture']['name'])){ //判断上传内容是否为空 if($_FILES['up_picture']['error']>0){ //判断文件是否可以上传到服务器 echo "上传错误:"; switch($_FILES['up_picture']['error']){ case 1: echo "上传文件大小超出配置文件规定值"; break; case 2: echo "上传文件大小超出表单中约定值"; break; case 3: echo "上传文件不全"; break; case 4: echo "没有上传文件"; break; } }else{ if(!is_dir("./upfile/")){ //判断指定目录是否存在 mkdir("./upfile/"); //创建目录 } $path='./upfile/'.time().strstr($_FILES['up_picture']['name'],'.'); //定义上传文件名称和存储位置 if(is_uploaded_file($_FILES['up_picture']['tmp_name'])){ //判断文件是否是HTPP POST上传 if(!move_uploaded_file($_FILES['up_picture']['tmp_name'],$path)){ //执行上传操作 echo "上传失败"; }else{ echo "文件".$_FILES['up_picture']['name']."上传成功,大小为:".$_FILES['up_picture']['size']; } }else{ echo "上传文件".$_FILES['up_pictute']['name']."不合法!"; } } } ?>
控制上传文件的大小有两个关键点:一是PHP的配置文件php.ini对上传文件的控制,如果上传文件的大小超过其指定的范围,那么上传就会失败;二是在PHP配置文件允许的范围内,在程序中对上传文件大小的控制。
第1点,在PHP中,通过php.ini文件对上传文件进行控制,包括是否支持上传、上传文件的临时目录、上传文件的大小、指令执行的时间、指令分配的内存空间。
在php.ini文件中,定义到File Uploads项,完成对上传相关选项的设置。上传相关选项的含义如下:
- file_uploads:如果值是on,说明服务器支持文件上传;如果为off,则不支持。一般默认是支持的,不需修改。
- upload_tmp_dir:上传文件的临时目录。在文件被成功上传之前,首先存放到服务器端的临时目录中,多数使用系统默认目录,但是也可以自行设置。
- upload_max_filesize:服务器允许上传文件的最大值,以MB为单位。系统默认为2MB,如果网站需要上传超过2MB的数据,那么就要修改这个值。
上述是php.ini文件的File Uploads项中与上传相关选项参数的设置说明,除了File Uploads项中的内容外,在php.ini文件中还有几个选项会影响到文件的上传。
- max_execution_time:PHP中一个指令所能执行的最大时间,单位是秒。在上传超大文件时必须修改该选项,否则即使上传文件在服务器允许的范围内,若是超过了指令所能执行的最大时间,仍然无法实现上传。
- memory_limit:PHP中一个指令所分配的内存空间,单位是MB,其大小同样会影响到超大文件的上传。
第2点,在客户端控制上传文件,应用的是form表单中的enctype和method属性,以及隐藏域MAX_FILE_SIZE。
- enctype="multipart/form-data":指定表单编码数据方式。
- method="post":指定数据的传输方式。
- <input type="hidden" name="MAX_FILE_SIZE" value="10">:通过隐藏域控制上传文件的大小(单 位为字节),该值不能超过php.ini配置文件中upload_max_filesize选项设置的值。它不能完全控制上传文件的大小,只是可以避免一些不必要的麻烦.
上述两种判断的结果都可以通过全局变最$_FILES的返回值来体现。$_FILES是一个数组,包含所有上传文件的信息。下面介绍$_FILES数组中每个元素的含义:
- $_FILES['userfile']['name']:存储上传文件的名称。
- $_FILES['userfile']['type'] :存储上传文件的MIME 类型。MIME类型规定各种文件格式的类型。每种MIME类型都是由“/”分隔的主类型和子类型组成,如image/gif,主类型为“图像”,子类型为GIF格式的文件;text/html代表文本的HTM文件。
- $_FILES['userfile']['size']:已上传文件的大小,单位为字节。
- $_FILES['userfile']['tmp_name']:文件被上传后在服务端储存的临时文件名。
- $_FILES['userfile']['error']:和该文件上传相关的错误代码。其返回值有以下5种:
- 0:表示没有任何错误,文件上传成功。
- 1:表示上传文件的大小超出了PHP配置文件指令upload_max_filesize选项限制的值。
- 2:表示上传文件的大小超出了HTML表单中"MAX_FILE_SIZE选项所指定的值。
- 3:表示文件只被上传了一部分。
- 4:表示没有上传任何文件。