11.3 文件的上传
在网络上用户可以上传自己的文件。实现这种功能的方法很多,用户把一个文件上传到服务器,需要在客户端和服务器端建立一个通道传递文件的字节流,并在服务器进行上传操作。下面介绍一种代码最少并且容易理解的方法。
下面案例主要讲述如何实现文件的上传功能,具体操作步骤如下。
【例11.9】(实例文件:ch12\11.10.php和11.10.1.php)
01 首先创建一个实现文件上传功能的文件。为了设置保存上传文件的路径,用户需要在创建文件的目录下新建一个名称为“file”的文件夹。然后新建11.10.1.php文件,代码如下。
<html> <head> <title>实现上传文件</title> </head> <body> <?php if ($_POST[add]=="上传"){ //根据现在的时间产生一个随机数 $rand1=rand(0,9); $rand2=rand(0,9); $rand3=rand(0,9); $filename=date("Ymdhms").$rand1.$rand2.$rand3; if(empty($_FILES['file_name']['name'])){ //$_FILES['file_name']['name']为获取客户端机器文件的原名称 echo "文件名不能为空"; exit; } $oldfilename=$_FILES['file_name']['name']; echo "<br>原文件名为:".$oldfilename; $filetype=substr($oldfilename,strrpos($oldfilename,"."),strlen($oldfilename)-strrpos($oldfilename,".")); echo "<br>原文件的类型为:".$filetype; if(($filetype!='.doc')&&($filetype!='.xls')&&($filetype!='.DOC')&&($filetype!='.XLS')){ echo "<script>alert('文件类型或地址错误');</script>"; echo "<script>location.href='11.3.php';</script>"; exit; } echo "<br>上传文件的大小为(字节):".$_FILES['file_name']['size']; //$_FILES['file_name']['size']为获取客户端机器文件的大小,单位为B if ($_FILES['file_name']['size']>1000000) { echo "<script>alert('文件太大,不能上传');</script>"; echo "<script>location.href='11.3.php';</script>"; exit; } echo "<br>文件上传服务器后的临时文件名为:".$_FILES['file_name']['tmp_name']; //取得保存文件的临时文件名(含路径) $filename=$filename.$filetype; echo "<br>新文件名为:".$filename; $savedir="file/".$filename; if(move_uploaded_file($_FILES['file_name']['tmp_name'],$savedir)){ $file_name=basename($savedir); //取得保存文件的文件名(不含路径) echo "<br>文件上传成功!保存为:".$savedir; }else{ echo "<script language=javascript>"; echo "alert('错误,无法将附件写入服务器!\n本次发布失败!');"; echo "location.href='11.3.php?';"; echo "</script>"; exit; } } ?> </body> </html>
代码分析如下:
(1)需要首先创建变量设定文件的上传类型、保存路径和程序所在路径。
(2)实现自定义函数获取文件后缀名和生成随机文件名。在上传的过程中,如果上传了大量的文件,可能会出现文件名称重复的现象,所以本实例在文件上传的过程中,首先获取上传文件的后缀名称并结合随机产生的数字,生成一个新的文件,避免了文件名称重复的现象。
(3)判断获取的文件类型是否符合指定类型,如果文件名称符合,则给该文件生成一个具有随机性质的名称,并使用move_uploaded_file函数完成文件的上传,否则显示提示信息。
02 下面创建一个获取上传文件的页面。创建文件11.10.php,代码如下。
<html> <head><title>上传文件</title></head> <h3 align="center">上传文件</h3> <form method="post" action="11.10.1.php" enctype="multipart/form-data"> <table border=0 cellspacing=0 cellpadding=0 align=center width="100%"> <tr> <td height="16"> <input name="file" type="file" value="浏览" > <input type="submit" value="上传" name="B1"> </td> </tr> </table> </form> </body> </html>
其中,“<form method="post" action="11.10.1.php" enctype="multipart/form-data">”语句中method属性表示提交信息的方式是post,即采用数据块,action属性表示处理信息的页面为11.10.1.php,ENCTYPE="multipart/form-data"表示以二进制的方式传递提交的数据。
运行结果如图11-11所示。单击【浏览】按钮,即可选择需要上传的文件,最后单击【上传】按钮即可实现上传操作。