文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
昨天因为校会要做一个上传页面,于是操起PHP简简单单写了一个上传代码,先备忘一下,有时间继续完善。
首先是上传的提交页面upfile.html
1 2 3 4 5 6 |
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <form action="upload.php" enctype="multipart/form-data" method="POST"> <input type="hidden" name="max_file_size" value="33554432"> <input type="file" name="file"> <input type="submit" name="submit" value="上传" /> </form> |
1. PHP支持HTML以POST的方法传输文件,但是form中必须声明enctype的属性="multipart/form-data",否则整个form表单将不起任何作用。
2. form表单中必须含有一个name为MAX_FILE_SIZE的隐藏域,这个隐藏域用来指定用户最大能上传的文件大小,必须声明在所有其他input标签之前。如果文件超大的话,浏览器直接就可以给出提示,不必浪费上传的时间。
下面就是上传处理文件upload.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<?php /* 设定上传目录 */ $dest_dir='uploads'; /* 检测上传目录是否存在 */ if( !is_dir($dest_dir) || !is_writeable($dest_dir) ) { die("上传目录 ".$dest_dir." 不存在或无法写入"); } /* 设置允许上传文件的类型 */ $type=array("rar","zip","txt","c"); /* 获取上传文件信息 */ $upfile=&$HTTP_POST_FILES['file']; /* 获取文件后缀名函数 */ function fileext($filename) { return substr(strrchr($filename, '.'), 1); } /* 判断上传文件类型 */ if( !in_array( strtolower( fileext($upfile['name'] ) ),$type) ) { $text=implode(",",$type); echo "对不起,您只能上传以下类型文件: ",$text,"<br>"; } else { /* 设置文件名为"日期_文件名" */ $dest=$dest_dir.'/'.date("ymdHis")."_".$upfile['name']; /* 移动上传文件到指定文件夹 */ $state=move_uploaded_file($upfile['tmp_name'],$dest); if ($state) { print("文件上传成功!<br>"); print("文件名:".$dest."<br>"); print("上传的文件大小:".( round($upfile['size'] / 1024,2) )." KB<br>"); } else { /* 处理错误信息 */ switch($upfile['error']) { case 1 : die("上传文件大小超出 php.ini:upload_max_filesize 限制<br>"); case 2 : die("上传文件大小超出 MAX_FILE_SIZE 限制<br>"); case 3 : die("文件仅被部分上传<br>"); case 4 : die("没有文件被上传<br>"); case 5 : die("找不到临时文件夹<br>"); case 6 : die("文件写入失败<br>"); } } } ?> |
本来应该是使用MIME类型来限制上传的,因为单纯使用后缀名限制文件类型会带来安全问题,但是实验的时候发现Firefox和IE对于一些文件的MIME类型看法不同...因为我写这个上传代码的初衷是上传rar、zip、txt、c之类的非图片类文件,安全问题不会很大,所以暂时先使用后缀判断吧...
PHP默认的上传限定是最大2M,想上传超过此设定的文件,需要调整PHP、apache等的一些参数,这些参数位于php.ini文件内:
file_uploads
是否允许通过HTTP上传文件的开关,默认为ON即是开
upload_tmp_dir
upload_tmp_dir用来说明PHP上传的文件放置的临时目录,要想上传文件,得保证服务器没有关闭临时文件和有对文件夹的写权限,如果未指定则PHP使用系统默认值
upload_max_filesize
允许上传文件大小的最大值,默认为2M
post_max_size
控制在采用POST方法进行一次表单提交中PHP所能够接收的最大数据量。如果希望使用PHP文件上传功能,则需要将此值改为比upload_max_filesize要大
max_input_time
以秒为单位对通过POST、GET以及PUT方式接收数据时间进行限制。如果应用程序所运行环境处在低速链路上,则需要增加此值以适应接收数据所需的更多时间
memory_limit
为了避免正在运行的脚本大量使用系统可用内存,PHP允许定义内存使用限额。通过memory_limit变量来指定单个脚本程序可以使用的最大内存容量变量memory_limit的值应当适当大于post_max_size的值
max_execution_time
max_execution_time设置了在强制终止脚本前PHP等待脚本执行完毕的时间,此时间以秒计算。当脚本进入了一个无限循环状态时此变量非常有用。然而,当存在一个需要很长时间完成的合法活动时(例如上传大型文件),这项功能也会导致操作失败。在这样的情况下必须考虑将此变量值增加,以避免PHP在脚本正在执行某些重要过程的时候将脚本关闭
转载请注明:Slyar Home » 简单的PHP上传代码