PHP实现文件上传

PHP文件上传,php.ini中的配置项为:

配置项 默认值 配置描述
file_uploads ON PHP脚本是否可以接受HTTP文件上传
upload_max_filesize 2M 限制PHP处理上传文件大小的最大值,此值必须小于post_max_size值
post_max_size 8M POST方法接受信息的最大值,除了上传文件,可能游其他的表单域,所以要大于upload_max_filesize
upload_tmp_dir NULL 上传文件临时路径,对于拥有此服务器的进程用户必须是可写的。默认为操作系统的临时文件夹,Linux的是在/tmp目录下

全局数组$_FILES,其中myfile为表单中name的值:

数组 描述
$_FILES['myfile']['name'] 上传文件的原文件名,包括后缀
$_FILES['myfile']['tmp_name'] 保存在upload_tmp_dir中的临时文件名
$_FILES['myfile']['size'] 上传的文件大小,单位为字节
$_FILES['myfile']['error']

上传文件时产生的常见错误号:

0:表示没有错误,上传成功

1:表示上传的文件超过了upload_max_file的值

2.上传的文件大小超过了表单中MAX_FILE_SIZE的值

3:表示只有部分上传

4.表示没有上传任何文件

$_FILES['myfile']['type'] 上传文件的MIME类型

 

两个函数:

  1. 函数原型为:bool is_uploaded_file(string filename)。用于判断是否为HTTP POST上传的文件,参数必须类似$_FILES['myfile']['tmp_name'],不能是$_FILES['myfile']['name'],如果是则返回true,用于防止潜在的攻击者对原本不能通过脚本交互的文件进行非法管理。
  2. 函数原型为:bool move_uploaded_file(string filename,string destination)。将HTTP POST上传的临时文件移动到新的路径。成功返回TRUE

上传文件流程:

  1. 通过$_FILES['myfile']['error']判断是否有错误产生,有错误则提示并退出脚本。
  2. 把$_FILES['myfile']['name']分割为数组,获取文件后缀名,或者通过$_FILES['myfile']['type']判断是否为允许的上传类型,如果不在允许上传的类型中,提示并退出脚本。
  3. 通过$_FILES['myfile']['size']判断是否超出了PHP限制的大小。
  4. 通过is_uploaded_file()函数和move_uploaded_file()将文件上传到相应的目录中。

文件上传PHP代码:

 1 <?php
 2 $save_path = "./uploads";                               //文件保存路径
 3 $max_size = 1000000;                                    //上传文件最大值
 4 $allow_type = array('gif','png','jpg','jpeg');          //允许上传的类型
 5 
 6 //判断保存的目录是否存在,如果不存在则创建保存目录
 7 if(!is_dir($save_path))
 8         mkdir($save_path);
 9 
10 //判断文件是否上传成功
11 if($_FILES['myfile']['error']){
12         echo "文件上传失败<br>";
13         switch($_FILES['myfile']['error']){
14                 case 1: die('上传的文件超出系统的最大值<br>');break;
15                 case 2: die('上传的文件超出表单允许的最大值<br>');break;
16                 case 3: die('文件只有部分被上传<br>');break;
17                 case 4: die('没有上传任何文件<br>');break;
18                 default: die('未知错误<br>');break;
19         }   
20 }
21 
22 //通过文件的后缀判断是否为合法的文件名
23 $hz = array_pop(explode('.',$_FILES['myfile']['name']));
24 if(!in_array($hz,$allow_type)){
25         die("该类型不允许上传<br>");
26 }
27 
28 //判断文件是否超过允许的大小
29 if($max_size < $_FILES['myfile']['size']){
30         die("文件超出PHP允许的最大值<br>");
31 }
32 
33 //为了防止文件名重复,在系统中使用新名称
34 $save_file_name = date('YmdHis').rand(100,900).'.'.$hz;
35 
36 //判断是否为HTTP POST上传的,如果是则把文件从临时目录移动到保存目录,并输出保存的信息;
37 if(is_uploaded_file($_FILES['myfile']['tmp_name'])){
38         if(move_uploaded_file($_FILES['myfile']['tmp_name'],$save_path.'/'.$save_file_name)){
39                 echo "上传成功!<br>文件{$_FILES['myfile']['name']}保存在{$save_path}/{$save_file_name}!<br>";
40         }
41         else{
42                 echo "文件移动失败!<br>";
43         }
44 }
45 else{
46         die("文件{$_FILES['myfile']['name']}不是一个HTTP POST上传的合法文件");
47 }
48   
View Code

 文件上传的html表单:

 1 <html>
 2 <head>  
 3         <title>uploadfile</title>
 4         <meta http-equiv="content-type" content="utf-8">
 5 </head>
 6 <body>
 7         <form method="POST" action="uploadfile.php" enctype="multipart/form-data">
 8                 <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
 9                 选择文件:<input type="file" name="myfile" ><br><br>
10                 <input type="submit" name="sub" value="upload">
11         </form>
12 </body>
13 </html>
View Code

 表单要加上enctype="multipart/form-data",表示上传的表单要传递一个文件:

需要改进的地方:

  1. 这些代码只能处理单个文件上传,应该做一些改进,从而能处理多个文件上传
  2. 可以封装成为一个函数或者一个类,提高代码的复用性。

---------------------------- 声明的分割线---------------------------

  1. 本文只适合实验,不适合现实应用,若造成不良后果,本人概不负责。
  2. 本文为原创博客,可以在个人平台自由转载,但需要注明出处,附上链接,否则视为盗用。严禁用于商业用途,如有需要,联系本人授权后方能使用
  3. 如有错误,欢迎大家斧正。若想交流,可发消息联系本人。
posted @ 2015-06-22 17:08 rancho945 阅读(...) 评论(...) 编辑 收藏