文章教程

6.5.1与上传相关的配置

9/17/2020 9:37:07 PM 人评论 次浏览

6.5 上传文件的“数据采集”

文件上传是许多WEB系统的一个基本功能,例如企业上传产品图片(BMP、JPG、GIF类型的文件)、个人上传简历(Word类型文件)等。与其他脚本语言相比,使用PHP可以轻松地实现文件上传功能。

6.5.1 与上传相关的配置

在表单的文件上传框前设置隐藏域MAX_FILE_SIZE后,可以限制上传文件的大小,但更多时候限制上传文件大小需要借助PHP配置文件php.ini实现,因此有必要了解一些与文件上传有关的PHP配置信息。下面的配置选项保存在php.ini配置文件中,可以适当地修改这些配置选项满足特定的文件上传需要。

(1)file_uploads。配置是否允许通过HTTP上传文件。默认值为On,表示PHP预处理器支持文件上传功能。典型配置示例:file_uploads = On。

(2)post_max_size。使用POST提交方式提交表单数据时,post_max_size选项用于配置PHP预处理器能够接受的最大表单数据大小。默认值为 8M,表示表单中所有数据(包括上传文件)大小之和必须小于8M字节,否则PHP程序将不能采集到任何的表单数据。即当表单数据大小大于post_max_size选项定义的值时,提交表单后,$_GET、$_POST和$_FILES将为空数组。典型配置示例:post_max_size = 8M。

(3)upload_max_filesize。配置当前表单中文件上传框允许上传文件的最大值,默认值为2M。当表单中有多个文件上传框时,可以使用upload_max_filesize选项限制每个上传文件的大小。即若表单有多个文件上传框时,文件大小不超过upload_max_filesize选项定义的上传框将上传成功,文件大小超过upload_max_filesize选项定义的上传框将上传失败,上传框之间互不影响上传结果。典型配置示例:upload_max_filesize = 2M。

(4)upload_tmp_dir。配置 PHP 上传文件的过程中产生临时文件(默认扩展名为 tmp)的目录。默认值为"c:/wamp/tmp",表示临时文件存放在目录“c:/wamp/tmp”中。典型配置示例:upload_tmp_dir = "c:/wamp/tmp"。

配置好上面4个参数后,在网络正常的情况下,上传小于2MB的文件一般不会出现问题。但如果要上传“大”文件,或者网速较慢,只进行上面的配置未必行得通,此时还需进行下面的配置。

(5)max_input_time。配置单个PHP程序解析提交数据(以POST或GET方式)的最大允许时间,单位是秒,默认值为60。当设置为−1时,表示不限制。典型配置示例:max_input_time = 60。

(6)memory_limit。配置单个PHP程序在服务器主机运行时,可以占用服务器最大内存数,默认值为128M。当设置为−1时,表示不限制。典型配置示例:memory_limit = 128M。

(7)max_execution_time。配置单个 PHP 程序在服务器端运行时占用服务器的最大时间,单位是秒,默认值为30。配置该选项可以有效避免死循环或大文件上传等程序长期占用服务器CPU导致服务器崩溃。如果设置值为0,表示不限制运行时间。典型配置示例:max_execution_time = 30。在PHP程序中使用set_time_limit()函数也可以设置该选项,例如:set_time_limit(0)。

6.5.2 PHP文件上传流程

PHP文件上传流程可以简单描述为如下几个步骤(PHP文件上传流程如图6-10所示)。

(1)提交包含上传文件的表单数据后,WEB服务器和PHP预处理器先判断表单数据大小是否超过 post_max_size 选项的配置。若超过,PHP 程序将无法得到任何表单数据,预定义变量$_GET、$_POST和$_FILES将为空数组;否则将进行第2步检验。

(2)检验表单中的文件大小是否超过表单隐藏域 MAX_FILE_SIZE 参数和 php.ini 文件中upload_max_filesize选项定义的大小。若超过表单隐藏域MAX_FILE_SIZE参数定义的大小,PHP预处理器返回状态代码2;若超过php.ini文件中upload_max_filesize选项定义的大小,PHP预处理器返回状态代码1。若通过第2步的检验,文件上传则进入第3步的检验。

figure_0126_0174第2步中某个文件上传框导致的文件上传失败,不影响其他文件上传框的上传结果。

(3)PHP实现文件上传时需要在upload_tmp_dir选项定义的目录中创建一个与上传文件对应的临时文件(默认扩展名为 tmp),上传成功后,临时文件立即消失,此时 PHP 预处理器返回状态代码0。但有时由于某些原因(如max_execution_time选项设置过小或网速慢等),上传部分文件后不再继续上传文件,导致文件上传失败,此时PHP预处理器返回状态代码3。若通过第3步检验,文件上传进入第4步。

(4)实现文件上传的关键一步在于在临时文件消失前,需将临时文件保存到 WEB 服务器或文件服务器。PHP 提供的两个函数:is_uploaded_file()函数和 move_uploaded_file()函数,可以帮助完成第4个步骤。

我们先了解一下预定义变量$_FILES数组,再讨论这两个函数的使用方法。

figure_0127_0175
图6-10 PHP文件上传流程

6.5.3 预定义变量$_FILES

使用预定义变量$_FILES可以获取上传文件的相关信息,包括上传文件名、文件MIME类型、文件大小等信息,$_FILES 是一个二维数组。例如可以在程序 register.php 中使用如下方法得到register.html表单中“个人相片”上传文件的相关信息。

xiao_1 $_FILES['myPicture']['name']:上传文件的文件名。

xiao_1 $_FILES['myPicture']['type']:上传文件的MIME类型。

xiao_1 $_FILES['myPicture']['size']:上传文件的大小,单位为字节。

xiao_1 $_FILES['myPicture']['tmp_name']:与上传文件相对应的服务器端的临时文件名。

xiao_1 $_FILES['myPicture']['error']:文件上传的状态代码。

说明如下。

(1)$_FILES 数组中,“键”名'myPicture'与文件上传框的名字myPicture对应。

(2)MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。例如GIF图片的MIME类型为image/gif。

(3)$_FILES['myPicture']['error']的取值及对应的意义如下。

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

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

xiao_1 2:上传文件的大小超过了FORM表单中MAX_FILE_SIZE参数指定的值。

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

xiao_1 4:表单没有选择上传文件。

6.5.4 PHP文件上传的实现

PHP提供了两个上传相关的函数:is_uploaded_file和move_uploaded_file函数。

1.is_uploaded_file()函数

语法格式:bool is_uploaded_file ( string fileName )

函数功能:is_uploaded_file()函数用于判断文件名为 fileName 的文件是否为上传过程中产生的临时文件。

例如is_uploaded_file($_FILES['myPicture']['tmp_name'])的返回值为TRUE。

2.move_uploaded_file()函数

语法格式:bool move_uploaded_file ( string fileName, string destination )

函数功能:move_uploaded_file()函数用于将上传过程中文件名为fileName的临时文件移动为由destination指定的文件,确保文件的成功上传。如果fileName 不是合法的临时文件,不会出现任何操作,move_uploaded_file()函数将返回 FALSE。

说明:如果目标文件destination已经存在,目标文件destination将会被覆盖。

为简单起见,这里仅用move_uploaded_file()函数实现文件上传,步骤如下。

(1)在register.php文件所在的目录(如C:\wamp\www\6\)下创建一个目录(如uploads)用于存放所有上传文件。

(2)修改register.php代码,将register.php程序修改为如下代码(粗体字部分为代码的改动部分,其他代码不变)。

<?php

//若提交的表单数据超过post_max_size的配置,防止程序继续执行

if(empty($_POST)){

exit("您提交的表单数据超过post_max_size的配置!<br/>");

}

echo "您填写的用户名为:".$_POST['userName'];

……

foreach($_POST['interests'] as $interest){

echo $interest." ";

}

echo "<br/>";

$myPicture = $_FILES['myPicture'];

$error = $myPicture['error'];

switch ($error){

case 0:

$myPictureName = $myPicture['name'];

echo "您的个人相片为:".$myPictureName. "<br/>";

$myPictureTemp = $myPicture['tmp_name'];

$destination = "uploads/".$myPictureName;

move_uploaded_file($myPictureTemp,$destination);

echo "文件上传成功!<br/>";

break;

case 1:

echo "上传的文件超过了 php.ini 中upload_max_filesize选项限制的值!<br/>";

break;

case 2:

echo "上传文件的大小超过了FORM表单MAX_FILE_SIZE选项指定的值!<br/>";

break;

case 3:

echo "文件只有部分被上传!<br/>";

break;

case 4:

echo "没有选择上传文件!<br/>";

break;

}

echo "<br/>";

echo "上传相片的文件大小不能超过:".$_POST['MAX_FILE_SIZE']."字节";

……

?>

单击图6-8中的“浏览”按钮选择上传的文件,单击“普通提交按钮”后可将浏览器端文件上传至WEB服务器“C:\wamp\www\6\uploads”目录中。至此完成了一个带有文件上传功能的“用户注册系统”。

教程类别