欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。

教程  php基础(十三)--文件操作、上传、指针、文件锁使用

PHP学习 本站 910 0评论

1. 远程文件的访问


PHP支持URL格式的文件调用,只要在php.ini中设置一下即可。找到allow_url_open,将该选项设置为ON,重启Apache即可。如:

fopen(‘http://localhost:8000/tm/sl/index.php’,’rb’);


2.文件指针


PHP可以实现文件指针的定位及查询,从而实现所需信息的快速查询。文件指针函数有rewind(),fseek(),feof(),ftell()。


1)rewind()函数

rewind() 函数将文件指针的位置倒回文件的开头。

若成功,则返回 true。若失败,则返回 false。

rewind(file)

file:必须参数,规定已打开的文件。

$file = fopen("test.txt","r");

//改变文件指针的位置

fseek($file,"15");

//把文件指针设定为 0

rewind($file);

fclose($file);

注意:如果将文件以追加(“a”)模式打开,写入文件的任何数据总是会被附加在文件已有内容的末尾,不论文件指针的位置在何处。


2)fseek()函数

fseek() 函数在打开的文件中定位。

该函数把文件指针从当前位置向前或向后移动到新的位置,新位置从文件头开始以字节数度量。

成功则返回 0;否则返回 -1。注意,移动到 EOF 之后的位置不会产生错误。

fseek(file, offset, whence)

参数描述

· file必需。规定要在其中定位的文件。

· offset必需。规定新的位置(从文件头开始以字节数度量)。

· whence可选。可能的值:

        SEEK_SET - 设定位置等于 offset 字节。默认。

        SEEK_CUR - 设定位置为当前位置加上 offset。

        SEEK_END - 设定位置为文件末尾加上 offset (要移动到文件尾之前的位置,offset 必须是一个负值)。

$file = fopen("test.txt","r");

// 读取第一行

fgets($file);

// 倒回文件的开头

fseek($file,0);


3)feof()函数

feof() 函数检测是否已到达文件末尾 (eof)。

如果文件指针到了 EOF 或者出错时则返回 TRUE,否则返回一个错误(包括 socket 超时),其它情况则返回 FALSE。

feof(file)

· file 参数是一个文件指针。这个文件指针必须有效,并且必须指向一个由 fopen() 或 fsockopen() 成功打开(但还没有被 fclose()关闭)的文件。

提示:feof() 函数对遍历长度未知的数据很有用。

注意:如果服务器没有关闭由 fsockopen() 所打开的连接,feof() 会一直等待直到超时而返回 TRUE。默认的超时限制是 60 秒,可以使用 stream_set_timeout() 来改变这个值。

注意:如果传递的文件指针无效可能会陷入无限循环中,因为 EOF 不会返回 TRUE。

//输出文本中所有的行,直到文件结束为止。
while(! feof($file))
  {
  echo fgets($file). "<br />";
  }
fclose($file);


4)ftell()函数

ftell() 函数在打开文件中的当前位置。

该函数返回文件指针的当前位置。若失败,则返回 false。

ftell(file)

· 文件指针 file 必须是有效的,且必须指向一个通过 fopen() 或 popen() 成功打开的文件。

· 在附加模式(加参数 "a" 打开文件)中 ftell() 会返回未定义错误。

$file = fopen("test.txt","r");

// 输出当前位置

echo ftell($file);

// 改变当前位置

fseek($file,"15");

// 再次输出当前位置

echo ftell($file);

fclose($file);


3.锁定文件


在向一个文本文件写入内容时,需要先锁定该文件,以防止其他用户同时修改此文件内容。

flock() 函数锁定或释放文件。

若成功,则返回 true。若失败,则返回 false。

flock(file, lock, block)

参数描述

· file必需。规定要锁定或释放的已打开的文件。

· lock必需。规定要使用哪种锁定类型。

· block可选。若设置为 1 或 true,则当进行锁定时阻挡其他进程。

说明

flock() 操作的 file 必须是一个已经打开的文件指针。

lock 参数可以是以下值之一:

· 要取得共享锁定(读取的程序),将 lock 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)。

· 要取得独占锁定(写入的程序),将 lock 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)。

· 要释放锁定(无论共享或独占),将 lock 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)。

· 如果不希望 flock() 在锁定时堵塞,则给 lock 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)。

$filename = '08.txt';   //声明要打开的文件的名称

$fd = fopen($filename,'w');   //以w形式打开文件

flock($fd, LOCK_EX);   //锁定文件(毒针共享

fwrite($fd, "hightman1");   //向文件中写入数据

flock($fd, LOCK_UN);   //解除锁定

fclose($fd);   //关闭文件指针

readfile($filename);   //输出文件内容


4.文件上传


1)文件上传函数

move_uploaded_file() 函数将上传的文件移动到新位置。

若成功,则返回 true,否则返回 false。

move_uploaded_file(file, newloc)

参数描述

· file必需。规定要移动的文件。

· newloc必需。规定文件的新位置。

本函数检查并确保由 file 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 newloc 指定的文件。

如果 file 不是合法的上传文件,不会出现任何操作,move_uploaded_file() 将返回 false。

如果 file 是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,move_uploaded_file() 将返回 false,此外还会发出一条警告。

这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。

<?php
if(!empty($_FILES[up_file][name])){
$fileinfo = $_FILES[up_file];
if($fileinfo['size'] < 1000000 && $fileinfo['size'] > 0){
move_uploaded_file($fileinfo['tmp_name'],$fileinfo['name']);
echo '上传成功';
}else{
echo '文件太大或未知';
}
}
?>
<form action="" method="post" enctype="multipart/form-data" name="form">
  <tr>
    <td height="30">&nbsp;</td>
    <td align="left" valign="middle"><input name="up_file" type="file" size="12" /></td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td height="27" align="right">&nbsp;</td>
    <td align="center" valign="top">&nbsp;&nbsp;<input type="image" name="imageField" src="images/fg.bmp"></td>
    <td>&nbsp;</td>
  </tr>
  </form>

在创建form表单时,必须设置enctype="multipart/form-data"


2)多文件上传

请选择要上传的文件

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


3)配置php.ini文件

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


用文本工具(推荐EditPlus)打开php.ini 配置文件,查找 File Uploads ,在这个区域有以下3个选项:

file_uploads = On是否允许HTTP文件上传。默认值为On允许HTTP文件上传,此选项不能设置为Off。

upload_tmp_dir =文件上传的临时存放目录。如果没指定则PHP会使用系统默认的临时目录。该选项默认为空,此选项在手动配置PHP运行环境时,也容易遗忘,如果不配置这个选项,文件上传功能就无法实现,你必须给这个选项赋值,比如upload_tmp_dir = "d:/fileuploadtmp" ,代表在D盘目录下有一个fileuploadtmp目录,并且给这目录读写权限。

upload_max_filesize = 2M上传文件的最大尺寸。这个选项默认值为2M,即文件上传的大小为2M,如果你想上传一个50M的文件,你必须设定 upload_max_filesize = 50M。

但是仅设置upload_max_filesize = 50M 还是无法实现大文件的上传功能,我们还必须修改php.ini文件中的 post_max_size 选项。


继续在 php.ini 中查找 Data Handling ,在这个区域有1个选项:

post_max_size = 8M

指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M。如果POST数据超出限制,那么$_POST和$_FILES将会为空。

要上传大文件,你必须设定该选项值大于upload_max_filesize选项的值,例如你设置了upload_max_filesize = 50M ,这里可以把post_max_size = 100M。

另外如果启用了内存限制,那么该值应当小于memory_limit 选项的值。


继续在 php.ini 中查找 Resource Limits ,在这个区域有3个选项:

max_execution_time = 30

每个PHP页面运行的最大时间值(单位秒),默认30秒。当我们上传一个较大的文件,例如50M的文件,很可能要几分钟才能上传完,但php默认页面最久执行时间为30秒,超过30秒,该脚本就停止执行,这就导致出现无法打开网页的情况。因此我们可以把值设置的较大些,如 max_execution_time = 600。 如果设置为0,则表示无时间限制。

max_input_time = 60

每个PHP脚本解析请求数据所用的时间(单位秒),默认60秒。当我们上传大文件时,可以将这个值设置的较大些。 如果设置为0,则表示无时间限制。

memory_limit = 128M

这个选项用来设置单个PHP脚本所能申请到的最大内存空间。这有助于防止写得不好的脚本消耗光服务器上的可用内存。如果不需要任何内存上的限制将其设为 -1。

php5.2.0以前的版本默认8M; php.5.2.0版本默认为16M。php 5.2.0之后的版本默认为 128M;


php.ini 配置上传文件功能示例

假设要上传一个50M的大文件。配置 php.ini 如下:

file_uploads = On

upload_tmp_dir = "d:/fileuploadtmp"

upload_max_filesize = 50M

post_max_size = 100M

max_execution_time = 600

max_input_time = 600

memory_limit = 128M

提示:需要保持 memory_limit > post_max_size > upload_max_filesize


预定义变量$_FILES

$_FILES变量存储的是上传文件的相关信息,对于上传功能有很大作用。该变量是一个二维数组。预定义变量$_FILES元素说明如下:

$_FILES[filename][name]  :存储了上传文件的文件名,如exam.txt等

$_FILES[filename][size]  :存储了文件大小,以字节为单位

$_FILES[filename][tmp_name]  :文件上传时,首先在临时目录中被保存成一个临时文件,该变量为临时文件名。

$_FILES[filename][type]  :上传文件的类型

$_FILES[filename][error]  :存储了上传文件的结果,如果值为0,说明上传文件成功。

<table width="500" border="0" cellspacing="0" cellpadding="0">
<form action="" method="post" enctype="multipart/form-data">
  <tr>
    <td width="150" height="30" align="right" valign="middle">请选择上传文件:</td>
    <td width="250"><input type="file" name="upfile"/></td>
    <td width="100"><input type="submit" name="submit" value="上传" /></td>
  </tr>
</form>
</table>
<?php
if(!empty($_FILES)){
foreach($_FILES['upfile'] as $name => $value)
echo $name.' = '.$value.'<br>';
}
?>


转载请注明: ITTXX.CN--分享互联网 » php基础(十三)--文件操作、上传、指针、文件锁使用

最后更新:2019-03-11 22:25:52

赞 (1) or 分享 ()
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽