A-A+

简单的PHP文件上传技术

2012年02月08日 PHP技术文章 暂无评论 阅读 91 views 次

文件上传可以通过HTTP协议来实现。要使用文件上传功能,首先要在php.ini配置文件中对上传做一些设置,然后了解预定义变量$_FILES,通过$FILES的值对上传文件做一些限制和判断,最后使用move_uploaded_file()函数实现上传。

一、配置php.ini文件

要想顺利地实现上传功能,首先要在php.ini中开启文件上传,并对其中的一些参数作出合理的设置,找到File Uploads项,可以看到下面有3个属性值,表示含义如下。

★ file_uploads:如果值是on,说明服务器支持文件上传;如果为off,则不支持。

★ upload_tmp_dir:上传文件临时目录。在文件被成功上传之前,文件首先存放到服务器端的临时目录中。如果想要指定位置,可在这里设置。否则使用系统默认目录即可。

★ upload_max_flesize:服务器允许上传的文件的最大值,以MB为单位。系统默认为2MB,用户可以自行设置。

除了File_Uploads项,还有几个属性也会影响到上传文件的功能。

★ max_execution_time:PHP中一个指令所能执行的最大时间,单位是秒。

★ memory_limit:PHP中一个指令所分配的内存空间,单位是MB。

说明:如果使用集成化的安装包采配置PHP的开发环境,上述介绍的这些配置信息默认已经配置好了。

注意:如果要上传超大的文件,需要对php.ini进行修改。包括upioad_max filesize的最大值max_execution_time一个指令所能执行的最大时间和memory_limit一个指令所分配的内存空。

二、预定义变量$_FILES

$_FILES变量存储的是上传文件的相关信息,这些信息对于上传功能有很大的作用。该变量是一个二维数组。保存的信息如下表所示。

元素名 说明
$_FILE[filename][name] 存储了上传文件的文件名。如exam.txt、myDream.jpg等
$_FILE[filename][size] 存储了文件大小。单位为字节
$_FILE[filename][temp_name] 文件上传时,首先在临时目录中被保存成一个临时文件,该变量为临时文件名
$_FILE[filename][type] 上传文件的类型
$_FILE[filename][error] 存储了上传文件的结果。如果返回0,说明文件上传成功

【例12.9】本例创建一个上传文件域,通过$_FILES变量输出上传文件的资料。实例代码如下:

<form action="" method="post" enctype="multipart/form-data">
<!-- 上传文件域,type类型为file -->
请选择上传文件:<input type="file" name="upfile"/>
<input type="submit" name="submit" value="上传" /><BR>
<?php
if(!empty($_FILES)){ //判断变量$_FIELS是否为空
foreach($_FILES&#91;'upfile'&#93; as $name => $value) //使用foreach循环输出上传文件信息的名和值
echo $name.' = '.$value.'<br>';
}
?>
</form>

图1 $_FILES预定义变量

三、文件上传函数

PHP中使用move_uploaded_file()函数上传文件。该函数的语法如下;

折叠PHP 代码复制内容到剪贴板
bool move_uploaded_file(string filename,string destination)
move_uploaded_file()函数将上传文件存储到指定的位置。如果成功,则返回true,否则返回false。参数filename是上传文件的临时文件名,即$_FILES[tmp_name];参数destination是上传后保存的新的路径和名称。

【例12.10】本例创建一个上传表单,允许上传150KB以下的文件。实例代码如下:

<form action="" method="post" enctype="multipart/form-data" name="form">
<input name="up_file" type="file" />
<input type="submit" name="submit" value="上传" />
</form>
<?php
if(!emptyempty($_FILES&#91;"up_file"&#93;&#91;"name"&#93;)){
$fileinfo = $_FILES&#91;"up_file"&#93;;
if($fileinfo&#91;'size'&#93; < 1000000 && $fileinfo&#91;'size'&#93; > 0){
move_uploaded_file($fileinfo['tmp_name'],$fileinfo['name']);
echo '上传成功';
}else{
echo '文件太大或未知';
}
}
?>

说明:使用move_uploaded_file()函数上传文件时,在创建form袁单时,必须设置form表单的enctype="multipart/form-data"属性。

四、多文件上传

PHP支持同时上传多个文件,只需要在表单中对立件上传域使用数组命名即可。

【例12.11】本实例有4个文件上传域,文件域的名字为u_file[],提交后上抟的文件信息都被保存到$_FILES[u_file]中,生成多维数组。读取数组信息,并上传文件。实例代码如下:

<form action="" method="post" enctype="multipart/form-data">
<table id="up_table" border="1" bgcolor="f0f0f0" >
<tbody id="auto">
<tr id="show" >
<td>上传文件 </td>
<td><input name="u_file&#91;&#93;" type="file"></td>
</tr>
<tr>
<td>上传文件 </td>
<td><input name="u_file&#91;&#93;" type="file"></td>
</tr></tbody>
<tr><td colspan="4"><input type="submit" value="上传" /></td></tr> </table> </form>
<?php
if(!empty($_FILES&#91;"u_file"&#93;&#91;"name"&#93;)){
$file_name = $_FILES&#91;"u_file"&#93;&#91;"name"&#93;;
$file_tmp_name = $_FILES&#91;"u_file"&#93;&#91;"tmp_name"&#93;;
for($i = 0; $i < count($file_name); $i++){
if($file_name&#91;$i&#93; != ''){
move_uploaded_file($file_tmp_name&#91;$i&#93;,$i.$file_name&#91;$i&#93;);
echo '文件'.$file_name&#91;$i&#93;.'上传成功。更名为'.$i.$file_name&#91;$i&#93;.'<br>';
}
}
}
?>

运行结果如图2所示。

图2 多文件上传

标签:

给我留言