首页 > Computer > Linux > PHP文件上传
2011
06-21

PHP文件上传

在PHP网站开发中,PHP程序如何实现文件上传功能,一直是新手的课题。而且文件上传功能一般都用得着,比如图片上传。今天就结合具体代码实例和详细注解和大家分享如何编写PHP文件上传代码,适合php初学者学习。

  PHP代码实例主要讲述的是图片上传,看懂程序后你可以修改相关文件类型就可以实现其他文件的上传功能。

编程环境

  PHP5.2.4,基本上PHP4.3以上版本,此代码都可以使用

准备工作

  检查upload_tmp_dir项

  如果PHP的开发环境是自行搭建的,你需要在编写文件上传程序前编辑php.ini文件,找到并编辑upload_tmp_dir选项,此项用来设定文件上传至服务器时的临时文件夹,比如upload_tmp_dir = E:/phpos/uploads,然后再重启Apache。如果PHP的开发环境使用的是傻瓜式一键安装包,一般upload_tmp_dir都是设定好了的,你也可以用phpinfo()函数查看下配置。

  编写一个upload文件,设定文件上传表单

1
2
3
4
5
<form enctype=“multipart/form-data” action=“upload.php” method=“post”> 
<input type=“hidden” name=“max_file_size” value=“100000”> 
<input name=“userfile” type=“file”>   
<input type=“submit” value=“上传文件”> 
</form>

  注意

  1、表单中enctype=”multipart/form-data”必须指定,以便让服务器知道文件带有常规的表单信息。

  2、必须有一个可以设置上传文件最大长度的表单区域,即允许上传文件的最大值(按字节计算),它是隐藏值域,即max_file_size,通过设置其Value(值)可以限制上传文件的大小,避免用户在花时间等待上传大文件之后才发现该文件太大了的麻烦。但是一般别人可以绕过这个值,所以安全起见,最好是在php.ini文件中配置upload_max_filesize选项,设定文件上传的大小,默认是2M。

文件上传程序

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
function uploadfile($type,$name,$ext,$size,$error,$tmp_name,$targetname,$upload_dir)
{
    $MAX_SIZE = 2000000;
    $FILE_MIMES = array(‘image/pjpeg’,‘image/jpeg’,‘image/jpg’,‘image/gif’,‘image/png’);
    $FILE_EXTS = array(‘.jpg’,‘.gif’,‘.png’,‘.JPG’,‘.GIF’,‘.PNG’);

    $file_path = $upload_dir.$targetname;
    
    if(!is_dir($upload_dir))
    {
        if(!mkdir($upload_dir))
            die(“文件上传目录不存在并且无法创建文件上传目录”);
        if(!chmod($upload_dir,0755))
            die(“文件上传目录的权限无法设定为可读可写”);
    }
    
    if($size>$MAX_SIZE)
        die(“上传的文件大小超过了规定大小”);

    if($size == 0)
        die(“请选择上传的文件”);

    if(!in_array($type,$FILE_MIMES) || !in_array($ext,$FILE_EXTS))
        die(“请上传符合要求的文件类型”);

    if(!move_uploaded_file($tmp_name, $file_path))
        die(“复制文件失败,请重新上传”);

    switch($error)
    {
        case 0:
            return ;
        case 1:
            die(“上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值”);
        case 2:
            die(“上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值”);
        case 3:
            die(“文件只有部分被上传”);
        case 4:
            die(“没有文件被上传”);
    }
}

参数说明
$type,$name,$size,$error,$tmp_name对应全局变量$_FILES中的相关变量,即:
$_FILES[‘userfile’][‘type’]:文件的MIME类型,需要浏览器提供该信息的支持,例如图片类型“image/gif”。

$_FILES[‘userfile’][‘name’]:客户端文件的原名称。

$_FILES[‘userfile’][‘size’]:已上传文件的大小,单位为字节。

$_FILES[‘userfile’][‘tmp_name’]:文件被上传后在服务端储存的临时文件名。

$_FILES[‘userfile’][‘error’]:和该文件上传相关的错误代码,即

值:0:没有错误发生,文件上传成功。

值:1:上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。

值:2:上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。

值:3:文件只有部分被上传。

值:4:没有文件被上传。

$ext:上传文件扩展名

$targetname:文件上传后的最终文件名

$upload_dir:上传至哪个目录下,采用的是相对路径

注释

第3行~第6行:设定图片文件上传的大小,以及文件的MIME类型以及扩展名,由于此代码为图片文件上传程序,所以两个数组中罗列了所有的图片类型,比如PNG,GIF,JEPG等。

第17行~第24行:如果文件是空的,size等于0;如果图片文件的扩展名或者类型不符,则跳出。

第26行:move_uploaded_file函数的功能是将upload_tmp_dir设定的服务端临时目录中的文件移至由$file_path指定的文件,注意如果目标文件已存在则覆盖目标文件

如何上传多个文件?比如同时上传3个文件

只需将

1
<input name=“userfile” type=“file”>

改成

1
2
3
<input name=“userfile[]” type=“file”>
<input name=“userfile[]” type=“file”>
<input name=“userfile[]” type=“file”>

对应的在调用此函数时,$_FILES[‘userfile’][‘name’][0],代表第一个文件的相关文件信息,依此类推,其他也一样。

总结

  此函数是PHP文件上传中最简单的核心代码,图片上传只是其中一种,只需要修改或者扩充$FILE_MIMES和$FILE_EXTS数组的相关信息,即可实现其他类型的文件上传功能。在函数的外围,根据自己的需要编写相关的其他代码即可实现其他功能,比如和数据库的关联等。

昨天分享了在PHP网站开发中如何在php.ini中配置实现session功能的PHP教程,今天继续分享在利用PHP实现文件上传功能时几点关键php.ini的配置。

  说到在php.ini中的文件上传的配置,其实在之前介绍PHP文件上传功能代码实例教程以及Jquery AjaxUpload实现文件上传功能代码实例教程时我都有所提及。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项。

  php.ini中文件上传功能配置选项说明

  打开php.ini配置文件找到File Uploads

  file_uploads = On

  默认允许HTTP文件上传,此选项不能设置为OFF。

  upload_tmp_dir =

  默认为空,此选项在手动配置PHP运行环境时,也容易遗忘,如果不配置这个选项,文件上传功能就无法实现,这个选项设置的是文件上传时存放文件的临时目录,你必须给这个选项赋值,比如upload_tmp_dir =’/leapsoulcn’,代表在C盘目录下有一个leapsoulcn目录,和session配置一样,如果你是在linux环境下,你必须赋予这个目录可写权限。

  如何上传超过8M的大文件?

  上传大文件主要涉及配置upload_max_filesizepost_max_size两个选项。

  php.ini配置文件中的默认文件上传大小为2M,php初学者容易犯的一个错误是在编写文件上传功能时通过设置上传文件最大大小的表单区域,即允许上传文件的最大值,max_file_size(隐藏值域)的值来规定上传文件的大小,其实一般别人可以绕过这个值,所以安全起见,最好是在php.ini配置文件中配置upload_max_filesize选项,设定文件上传的大小。

  默认upload_max_filesize = 2M,即文件上传的大小为2M,如果你想上传超过8M的文件,比如20M,你必须设定upload_max_filesize = 20M。

  但是光设置upload_max_filesize = 20M还是无法实现大文件的上传功能,你必须修改php.ini配置文件中的post_max_size选项,其代表允许POST的数据最大字节长度,默认为8M。如果POST数据超出限制,那么$_POST和$_FILES将会为空。要上传大文件,你必须设定该选项值大于upload_max_filesize指令的值,我一般设定upload_max_filesize和post_max_size值相等。另外如果启用了内存限制,那么该值应当小于memory_limit选项的值。

  文件上传的其他注意事项

  在上传大文件时,你会有上传速度慢的感觉,当超过一定的时间,会报脚本执行超过30秒的错误,这是因为在php.ini配置文件中max_execution_time配置选项在作怪,其表示每个脚本最大允许执行时间(秒),0 表示没有限制。你可以适当调整max_execution_time的值,不推荐设定为0。

  至此,在php.ini配置文件中对文件上传选项进行配置的PHP教程就介绍完毕了,通过上面的步骤实践与学习,再结合PHP程序,文件上传功能就可以实现了。

  PHP网站开发教程-leapsoul.cn版权所有,转载时请以链接形式注明原始出处及本声明,谢谢。

最后编辑:
作者:wy182000
这个作者貌似有点懒,什么都没有留下。

留下一个回复