七、PHP基础教程,文件上传解析

配置PHP支持文件上传功能时的几点配置:

1. 一般的文件上传,除非文件很小.就像一个5M的文件,很可能要超过一分钟才能上传完.但在php中,默认的该页最久执行时间为 30 秒.就是说超过30秒,该脚本就停止执行.这就导致出现 无法打开网页的情况.这时我们可以修改 max_execution_time

在php.ini里查找

max_execution_time

默认是30秒.改为

max_execution_time = 0

0表示没有限制

另一种方法是可以在php程序中加入

set_time_limit();

来设定页面最久执行时间.

set_time_limit(0);

//0表示没有限制

2. 修改 post_max_size 设定 POST 数据所允许的最大大小。此设定也影响到文件上传。

php默认的post_max_size 为2M。如果 POST 数据尺寸大于 post_max_size $_POST 和 $_FILES superglobals 便会为空。

查找 post_max_size .改为

post_max_size = 150M

3. 很多人都会改了第二步.但上传文件时最大仍然为 8M。

为什么呢.我们还要改一个参数upload_max_filesize 表示所上传的文件的最大大小。

查找upload_max_filesize,默认为8M改为

upload_max_filesize = 100M

另外要说明的是:post_max_size 大于 upload_max_filesize 为佳。

文件上传解析:

文件上传使用的是POST方式,一个基本的文件上传表单如下:

fileupload.htm

<
form enctype=”multipart/form-data” action=”dealfileupload.php” method=”POST”>

选择要上传的文件: <input name=”userfile” type=”file”/>

<input type=”submit” value=”上传”/>

</form>

  需要注意的是enctype属性的值以及file控件里的name属性,这是用来标识上传的文件的。该表单的处理脚本如下:

dealfileupload.php

<?php

$docroot=$_SERVER[‘DOCUMENT_ROOT’];

$fileupload=$docroot.”/upload/”.$_FILES[‘userfile’][‘name’];

if (move_uploaded_file($_FILES[‘userfile’][‘tmp_name’],$fileupload))

{

echo “文件上传成功”;

}

else

{

echo “文件上传失败”;

}

?>

  如果上传成功,则文件将被保存到网站根目录下的upload目录中。下面让我们分析一下这段简单的处理脚本。

1.1 $_FILES数组

1、$_FILES 系统函数

七、PHP基础教程,文件上传解析

图片来源于网络

在这里要注意,$_FILES[‘myFile’][‘name’]中“myFile”就是文件上传表单中用于存放文件路径的文本框的name属性的值。

2、move_uploaded_file函数(上传后移动文件到目标位置的函数)

move_uploaded_file(临时文件,目标位置和文件名的相对路径);

3、is_uploaded_file 函数(判断上传MIME类型的文件函数)

is_uploaded_file(MIME);

  如果表单中file控件里name属性的值为userfile,则$_FILES[‘userfile’]包含了该上传文件的信息。假定我们上传了名为temp.txt的文件,则:

$_FILES[‘userfile’][‘name’]=”temp.txt” 文件名

$_FILES[‘userfile’][‘tmp_name’]=”c:/tmp1″ 完整的临时文件名

$_FILES[‘userfile’][‘type’]=”text/plain” 文件类型

$_FILES[‘userfile’][‘size’]=1024 文件大小(字节数)

$_FILES[‘userfile’][‘error’]=0 错误代码,0表示成功

1.2 bool move_uploaded_file (string filename, string destination)

  该函数专门负责转移上传的文件。filename表示完整的临时文件名,一般是$_FILES[‘file1’][‘tmp_name’];destination表示完整的目的文件名,一般使用$_SERVER[‘DOCUMENT_ROOT’].”/upload/”.$_FILES[‘file1’][‘name’]。如果上传成功,则返回1,否则返回0并报错。如果想要隐藏错误提示,可以这样写:@move_uploaded_file(…)

1.3 如果需要上传多个文件,则可以设置多个file控件,注意name属性要设置为不同。如:

filesupload.htm

<
form enctype=”multipart/form-data” action=”dealfilesupload.php” method=”POST”>

选择要上传的文件1: <input name=”file1″ type=”file”/>

选择要上传的文件2: <input name=”file2″ type=”file”/>

<input type=”submit” value=”上传”/>

</form>

dealfilesupload.php

<?php

$docroot=$_SERVER[‘DOCUMENT_ROOT’];

$file1upload=$docroot.”/upload/”.$_FILES[‘file1’][‘name’];

$file2upload=$docroot.”/upload/”.$_FILES[‘file2’][‘name’];

if (@move_uploaded_file($_FILES[‘file1’][‘tmp_name’],$file1upload))

{

echo “文件1上传成功”;

}

else

{

echo “文件1上传失败”;

}

print “<br/>”;

if (@move_uploaded_file($_FILES[‘file2’][‘tmp_name’],$file2upload)){

echo “文件2上传成功”;

}else{

echo “文件2上传失败”;

}

?>

1.4 PHP生成HTML文件原理

1、PHP部分文件操作函数

(1) fopen 打开文件函数

fopen (路径和文件名,打开方式);

//R-只读 W-写入 A-读写

‘r’ 只读方式打开,将文件指针指向文件头。

‘r+’ 读写方式打开,将文件指针指向文件头。

‘w’ 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。

‘w+’ 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。

‘a’ 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。

‘a+’ 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。

(2) fread 读取文件内容

fread (打开的文件,结束位置);

// 字节为单位

(3) filesize 读取文件大小,以字节为计量单位,对于2~4GB之间的文件,可以使用sprintf(“%u”,filesize($file))//(格式化输出函数)来处理

filesize (路径和文件名);

(4) fwrite 写入文件内容

fwrite (打开的文件,写入的内容);

(5) fclose 关闭打开的文件

fclose (打开的文件);

(6) file_get_contents(“路径和文件名”);

//功能是读取整个文件内容

(7) file_ exists(path);

//函数检查文件或目录是否存在

(8) chmod(相对路径,代表PHP可访问的权限数值八进制);

//更改文件或文件夹的访问权限模式

2、目录操作常用函数

mkdir() 建立新目录函数

语法:mkdir(path,[int mode,][recursive,][context])

说明:path是必须参数,给出将要新建的文件夹所在的路径和名称,最好是使用绝对路径;mode是可选参数,默认值是0777(尝试以最大目录权限进行操作),该参数是八进制,即要设置该参数就必须将数值以0开头;recursive是可选参数,指出是否使用递归模式;context是可选参数,规定文件句柄的环境。Context 是可修改流的行为的一套选项。创建成功返回TRUE,否则返回FALSE。

rmdir()删除一个指定名称的空目录

语法:rmdir(目录路径和名称)

说明:尝试删除 目录路径和名称 所指定的目录。该目录必须是空的,而且要有相应的权限。如果成功则返回 TRUE,失败则返回 FALSE。

unlink() 删除文件函数

   语法:unlink(路径和文件名)

说明:删除 路径和文件名称 所指定的文件。和 Unix C 的 unlink() 函数相似。如果成功则返回 TRUE,失败则返回 FALSE。

3、其它文件操作函数

(1)string basename(string path [,string suffix]) ,path参数给出一个文件的全路径字符串,函数返回基本的文件名。如文件名以suffix结束,则去掉这部分

(2)string dirname(string path) ,返回路径中的目录部分。

(3)array pathinfo(string path) ,返回文件路径的信息,包含以下的数组单元dirname,basename,extension.

(4)string realpath(string path) ,返回规范化的绝对路径名

(5)bool copy( string source ,string dest) ,将文件从source复制到dest

例:copy(“hello.txt”,”temp.php”);

(6)float disk_free_space(string directory ) ,返回目录中的可用空间

例:$df = disk_free_space(“F:\”);

echo $df.”<br>”;

(7)float disk_total_space(string directory) ,获取指定磁盘总空间

例:$df=disk_total_space(“F:\”);

echo $df.”<br>”;

(8)int file_put_contents(string filename,string data[,int flags[,resource context]]),将一个字符串写入文件

(9)string file_get_contents(string filename [,int use_include_path[,resource context]]) ,将整个文件作为一个字符串读入。不需要之前fopen()

例:$lines=file_get_contents(“hello.txt”);

  echo nl2br($lines);

(10)int fileatime(string filename) ,取得文件的上次访问时间

例:echo date(“F d Y H:i:s”,fileatime($filename);

(11)int filemtime(string filename),取得文件的最近修改时间

例:echo date(“F d Y H:i:s”,filemtime($filename);

(12)array stat(string filename) 给出文件的信息or lstat( string filename) or fstat( resource handle)

例: $fileinfo =stat($filename);

echo “<table border=1>
<th>数字下标</th>
<th>关键(自PHP 5.1.4)</th>”;

foreach($fileinfo as $num=>$info)

{

echo “<tr>
<td>”.$num.”</td>
<td>”.$info.”</td>
</tr>”;

}

echo “</table>”;

(13)string filetype(string filename) ,获取文件的类型

例:echo filetype($filename);

(14)bool is_dir(string filename) ,判断给定的文件名是否是一个目录

例:if(is_dir($filename))

echo $filename.”为目录<br>”;

else

echo $filename.”非目录<br>”;

(15)bool flock(int handle,int operation [,int &

wouldblock]) ,进行文件锁定

operation: LOCK_SH:共享锁定

LOCK_EX: 独占锁定

LOCK_UN: 释放锁定

(16)bool is_uploaded_file(string filename)

判断文件是否通过HTTP POST上传

(17)bool move_uploaded_file(string filename,string destination)

检测文件是否是合法的上传文件,是则移动到destination 指定的文件

(18)array file(path,include_path,context)

函数把整个文件读入一个数组中。与 file_get_contents() 类似,不同的是 file() 将文件作为一个数组返回。数组中的每个单元都是文件中相应的一行,包括换行符在内。如果失败,则返回 false。

path 必需。规定要读取的文件。include_path 可选。如果也想在 include_path 中搜寻文件的话,可以将该参数设为 “1”。context 可选。规定文件句柄的环境。 context 是一套可以修改流的行为的选项。若使用 null,则忽略。

注释:如果碰到 PHP 在读取文件时不能识别 Macintosh 文件的行结束符,可以激活 auto_detect_line_endings 运行时配置选项。

(19) string fgetss()

fgetss() 函数从打开的文件中读取一行并过滤掉 HTML 和 PHP 标记。与 fgets() 相同,不同的是 fgetss 尝试从读取的文本中去掉任何 HTML 和 PHP 标记。

使用方法:fgetss(file,length,tags)

file 必需。规定要读取的文件。length 可选。规定要读取的字节数。默认是 1024 字节。该参数在 PHP 5 之前是必需的。tags 可选。规定将被删除的标签。可以用可选的第三个参数 tags 指定哪些标记不被去掉。若失败,则返回 false。

<?php

$file = fopen(“test.htm”,”r”);

echo fgetss($file,1024,”<p>,<b>”);

//保留p和b标记

fclose($file);

?>

(20) string fgets()

fgets() 函数从文件指针中读取一行。file 必需。规定要读取的文件。length 可选。规定要读取的字节数;

默认是 1024 字节。

从 file 指向的文件中读取一行并返回长度最多为 length – 1 字节的字符串。碰到换行符(包括在返回值中)、EOF 或者已经读取了 length – 1 字节后停止(要看先碰到那一种情况)。如果没有指定 length,则默认为 1K,或者说 1024 字节。

若失败,则返回 false。

4、遍历文件夹中的文件

<?php

$dir=opendir(”文件夹路径名”);

//打开文件夹,返回一个文件夹对象(句柄)

while($fileName=readdir($dir))//readdir(参数是用opendir打开的文件夹对象名),每执行一次都会

取出指定文件夹中的一个文件名称,且文件指针向下移动一个

{

echo ”fileName=”.$fileName. ”<br />”;

//输出取得的文件名

}

?>

opendir() 函数返回一个目录句柄即文件夹对象,可由 closedir(),readdir() 和 rewinddir() 使用。

若成功,则该函数返回一个目录流,否则返回 false 以及一个 error。可以通过在函数名前加上 “@” 来隐藏 error 的输出。

readdir() 函数返回由 opendir() 打开的目录句柄中的文件名称。若成功,则该函数返回一个文件名,否则返回 false。

5、文件上传成功后要清除其所占用的内存,方法是使用imagedestroy()函数。详见手册