首頁 >php教程 >php手册 >PHP 檔案系統詳解_php基礎

PHP 檔案系統詳解_php基礎

WBOY
WBOY原創
2016-05-16 09:00:221707瀏覽

文件处理函数
1.文件操作.
  打开文件:
    打开指定的文件时会返回相应的对象,若不存在指定的文件,那麽可能会自动创建这个文件。
    resource fopen(string filename,string mode [,int use_include_path][,resource context]);
      filename 可以是包含文件路径的文件名,也可以是某种协议给出的URL(打开远程文件).为了避免系统切换带来的麻烦,采用'/'作为路径分隔符.
      mode: 设置打开文件的方式,分别有:
           r:只读模式,文件指针位于文件头部.
           r :只读模式----读/写模式,文件指针位于头部文件.注意可能产生覆盖.
           w:只写模式,文件指针位于文件头部.如果文件存在,删除内容重写;否则,自行创建文件.
           w :只写模式----读写文件,读/写文件指针指向文件头部.如果文件存在,删除内容重写;否则,自行创建文件.
           x:谨慎写----写模式打开文件,从文件头部开始写如.如果文件存在,返回false,产生一个E_WARNING级别的错误信息
           x :谨慎写---读写模式代开文件.如果文件存在,返回false,产生一个E_WARNING级别的错误信息
           a:追加,文件指针指向文件尾部.如果文件存在,则直接在文件尾追加;否则,自行创建文件.
           a :追加,文件指针指向文件尾部.如果文件存在,则直接在文件尾追加或者读取;否则,自行创建文件.
           b:二进制模式.用于与其他模式进行链接.(windows 下的选项)
           t: 用于与其他模式进行结合.(windows 下的选项)
    请慎用fopen()函数,因为一不小心就有可能将文件删除掉.同时,不同的操作系统具有不同的行结束习惯(UNIX:\n Windows:\r\n Macinitosh:\r).如果错误的使用行结束符,那么当打开文件时,可能输出一堆乱码.以上可以通过"'t'","'b'"来避免.
读取文件:
  string fgetc(resource handle);//返回从handle指向的文件中的一个字符.如果遇到EOF,则返回false;
  string fgets(int handle[,int length]);//从文件指针指向的位置获取一行字符,并且返回最大为length-1个字节的字符串..文件指针必须有效,且指向一个由fopen()或fsockopen()成功打开的文件.length表示读取的数据的长度.在遇到换行,EOF,或者指定length时结束.忽略length将读到行结束.
  string fgetss(resource handle[,int length][,string allowable_tags]);//读取一行,且过滤掉html,php标记.
  string fread(int handle,int length);//从文件中读取任意长度的数据。,也可以用於讀取二進位檔案。 handle 為指向檔案的資源,length 讀取length個位元組或遇到EOF時停止執行。
範例:

複製程式碼 程式碼如下:

$filename="./files.text";
$fp=fopen($finename,"rb");
$encho fread($fp,100);
?>
div>
readfile(),file()和file_get_contents()函数.
readfile(),file()和file_get_contents()函数.
  int readfile(string filename[,bool use_include_path,resource context]);//读取一个文件并写入到缓冲区,如果成功,则返回读取的字节数,否则返回false。filename文件名。参数use_include_path控制是否支持在include_path中搜索文件,true为支持。使用readfile函数不需要打开/关闭文件。
  array file(string filename [,bool use_include_path[,resource context]]);//将整个文件的内容读取到数组中。如果成功,返回数组,数组中的每个元素都是文件中对应的一行,包活换行符在内;否则返回false;
  string file_get_contents(string filename[,bool use_include_path[,resource context[,int offset[,int maxlen]]]]);//context 为5.0新增的内容,可以用NULL来忽略。offset,maxlen为5.1的的内容。offset 用于标记文件啓始的位置,maxlen 设置文件读取的长度。该方法适用于二进制文件的读取。是将文件内容读入到一个字符串的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。如果打开有特殊字符的URL(例如存在空格),那麽要使用urlencode()来进行URL编码。

备注:readfile(),file()和file_get_contents()在读取整个文件夹中的内容时,不需要使用fopen()和fclose()函数,但是在读取一个字符,一行字符和任意长的字符时则必须使用。

2.写入文件:
    int fwrite(resource handle,string[,int length]);//执行文件的写入操作,它还有一个别名fputs().该方法用于把string的内容写入文件指针handle处。如果设置length,那麽写入length个字节或者完成string写入后,操作就会停止。成功写入则返回true,否则返回false。
备注:若给出length参数,那麽php.ini文件中的magic_quotes_runtime选项将会被忽略,而string中的斜线将不会被抽去。区分二进制文件和文本文件系统则在打开文件时fopen()函数的mode参数要加上‘b'。
   int file_put_contents(string filename,string data[.int flags[,resource context]]);//将一个字符串写入文件中,如果成功则返回字节数,否则返回false。flags:实现对文件的锁定(选项有 file_use_include_path,file_append:追加,lock_ex:独佔锁定)。context一个context资源。
备注:fwrite()虽然具备写入文件的功能,但是必须有fopen()和fclose()函数的支持。file_put_contents()整合了fopen(),fwrite(),fclose()功能,可以单独完成文件的写入。
3.关闭文件
  文件有打开就应该有关闭功能,对文件的操作结束后,应该关闭这个文件,否则可能引起错误。
  bool fclose(resouce handle);//将参数handle指向的文件关闭,如果成功则返回true,否则返回false。

锁定文件
  在向一个文本文件中写入数据的时候,需要先锁定文件,已防止其他用户同时也修改此文件的内容。php中通过flock()函数实现文件的锁定。
   bool flock(int handle ,int operation);//参数operation控制锁定权限。包括:lock_sh:取得共享锁定(读取程序)。lock_ex:取得独佔锁定(写入)。lock_un:释放锁定。lock_nb:防止flock()函数在锁定时堵塞。

目录处理函数
  目录是一种特殊的文件。既然是文件,如果对其进行操作,同样必须先打开,然后才可以进行浏览操作,最后还要记得关闭。

1.打开目录

  打开指定的目录文件,若果成功,则返回目录的句柄。否则返回false。与打开文件不同的是,若目录不存在,它并不会自动创建目录,而是抛出一个错误信息。通过在opendir()函数前加“@”符号,可以屏蔽错误信息的输出。
  resource opendir(string path[,resource context]);//path指定要打开的目录文件。如果path指定的不是一个有效的目录,或者因为权限问题,文件系统错误不能打开,那麽该函数将会返回false,并且产生一个E_WARNING级别的错误信息。

2.浏览目录


 利用opendir函数返回的句柄配合scandir函数实现浏览操作。
  array scandir(string directory[,int sorting_ordering[,resource context]]);//用于浏览指定路径下的目录和文件。如果成功则返回包含文件名的array,否则返回false。directory指定要浏览的目录,如果不是目录,那麽将返回false,并且产生一个E_WARNING级别的错误信息。sorting_order设置排列顺序,默认为字母升序排列。如果带上该参数,则变为降序排列。
备注:is_dir()函数,判断指定文件名是否一个目录。如果文件名存在且为目录,则返回true,否则返回false。如果是相对目录,则按照当前工作目录检查其相对路径。

3.关闭目录。

  void closedir(resource handle);//handle,要关闭的工作目录的句柄。

备注:前面已经了解到,若打开的目录不存在,系统并不会帮我们创建目录。那麽我们可以自行创建想要的目录。可以应用以下函数:
    mkdir()函数:新建一个目录,成功则返回true,否则false。
    rmdir()函数:删除目录。目录必须为空(目录中无文件或者子目录),且要有操作的权限。
    unlink()函数:删除文件,成功则返回true,失败返回false。

文件上传、下载原理 
       
步骤内容:
  步骤1:控制上传文件,通过php.ini文件配置。
  步骤2:对上传文件进行判断。上傳文件的大小,格式等。
  步驟3:執行上傳檔案的操作方法。

1.控制上傳檔案:

  php透過對php.ini對上傳檔案進行控制,包括:是否支援上傳、上傳檔案的暫存目錄、上傳檔案的大小、指令執行的時間與指令分配的記憶體空間。
    在php.ini檔案中定位到file uploads選項,完成上述選項的設定。選項意義如下:
    file_uploads:如果是on,表示伺服器支援檔案上傳,如果為off,則不支援。一般預設是支援的,此選項不必修改。
    upload_tem_dir:上傳檔案的暫存目錄。在檔案上傳成功之前,檔案首先保存在伺服器的暫存目錄中。多數使用系統預設目錄,但是也可以自行設定。
    upload_max_filesize:伺服器允許上傳檔案的最大值,以MB為單位。系統預設為2MB,若超過則須修改其值。
    max_execution_time:php中一個指令所能執行的最長時間,單位是秒。該指令在執行上傳超大檔案時必須修改,否則及時上傳檔案在伺服器允許的範圍內,但是超過指令所能執行的最長時間,仍然無法實現上傳。
    memory_limit:php中一個指令所分配的記憶體空間,單位時MB。它的大小同樣會影響超大檔案的上傳。

備註:在客戶端控制上傳檔案應用的時form表單中的enctype和method屬性,以及隱藏域MAX_FILE_SIZE.
    enctype="multipart/form-data":指定表單編碼資料方式。
    method="post":指定資料傳輸的方式。
    :透過隱藏域控制上傳檔案的大小,單位為位元組。該值不能超過php.ini設定檔中的upload_max_filesize選項設定的值。它不能完全控制上傳檔案的大小,只能避免一些不必要的麻煩。

2.判斷上傳檔案

  對上傳檔案進行判斷應用的是全域變數$_FILES,$_FILES是一個數組,它包含所有上傳檔案的信息。陣列中各元素意義如下:
    $_FILES[filename][name]:儲存上傳檔案的檔案名,如text.txt,title.jpg等。
    $_FILES[filename][size]:儲存檔案的大小,單位為位元組。
    $_FILES[filename][tem_name]:儲存檔案在暫存目錄中使用的檔案名,因為檔案在上傳時首先要將其以暫存檔案的身分儲存在暫存目錄中。
    $_FILES[filename][type]:儲存上傳檔案的MIME類型。 MIME規定各種文件格式的類型,每種MIME類型都時由「/」分隔的主類型和子類型組成。例如:"image/gif"的主類型為圖像,子類型為GIF格式的檔案。 "text/html"代表文字的HTML檔案。
    $_FILES[filename][error]:儲存檔案上傳的錯誤代碼:此項目為PHP4.2.0版本新增內容。它的回傳值由5種:
      0:表示沒有任何錯誤。文件上傳成功。
      1:表示上傳檔案的大小超出設定檔指令upload_max_filesize選項的限定值。
      2:表示上傳檔案的大小超出HTML表單中max_file_size選項所指定的值。
      3:表示文件只上傳了一部分。
      4:表示沒有上傳任何文件。
範例:
複製程式碼 程式碼如下:

/*判斷是否由上傳圖片*/
if(!empty($_FILES['up_picture'][name])){
/*將圖片資訊賦值給變數*/
$type=strtolower (strstr($_FILES['up_picture'][name],"."));
if($type != '.jpg' && $type != '.gif') echo "你上傳的檔案格式不對";
else{
if($_FILES['up_picture'][size]0){
echo "上傳檔案名稱:" .$_FILES['up_picture'][name]."
";
echo "上傳檔案類型:".$type."
";
echo "上傳檔案大小:" .$_FILES['up_picture'][size]."
";
}else echo "圖片大小不符合要求。";
}
}
?>


3.檔案上傳。

  php中應用move_uploaded_file()函數實作檔案上傳。但在執行之前,為了防止潛在的攻擊對原本無法透過腳本互動的檔案進行非法管理,可以先應用is_uploaded_file()函數判斷指定的檔案是否透過HTTP POST上傳的,如果是則傳回true。透過該函數,可以確保惡意的使用者無法欺騙腳本去存取不能存取的檔案。
   bool is_uploaded_file(string name);//用來判斷指定的檔案是否透過HTTP POST上傳的。 filename必須類似$_FILES[‘filename'][‘temp_name']的變量,不可以使用從客戶端上傳的檔案名稱$_FILES[‘filename'][‘name']。

   move_upload_file(string filename,string destination);//此函數用於將檔案上傳到伺服器中指定的位置。如果成功,則傳回true,否則傳回false。 filename指定上傳檔案的暫存檔案名,即$_FILES['tmp_name'],參數destination指定檔案上傳後儲存的新路徑和名稱。如果參數不是合法的上傳文件,則不會出現任何操作,則函數將傳回false。如果是合法的上傳操作,但是由於某些原因無法移動,則不會出現任何操作,返回false的同時將會發出警告。
複製程式碼 程式碼如下:

if( !empty($_FILES[ 'up_picture' ][ 'name' ])){
if( $_FILES['up_picture']['error'] > 0){
echo "上传错误!";
switch($_FILES['up_picture']['error']){
case 1:
echo "上传文件超出配置文件规定值";
break;
case 2:
echo "上传文件超出表单规定值";
break;
case 3:
echo "上传文件不全";
break;
case 4:
echo "没有上传文件";
break;
}
}else{
if( ! is_dir('./upfile/') ) mkdir('./upfile/');
$path='./upfile/'.time().$_FILES['up_picture' ][ 'name' ];
if( is_uploaded_filed( $_FILES['up_picture' ][ 'tmp_name' ] )){
if(!move_uploaded_file( $_FILES['up_picture' ][ 'tmp_name' ] ,$path )){
echo "上传失败!";
}else{
echo "文件".time().$_FILES['up_picture' ][ 'name' ] ."上传成功,大小为:".$_FILES['up_picture' ][ 'size' ] ;
}
}else{
echo "上传文件".$_FILES['up_picture' ][ 'name' ]."不合法";
}
}
}
?>


4.文件下载

这裡介绍通过http方式下载文件,主要用到header()函数。header()函数属于HTTP函数,其作用是以HTTP将HTML文档的表头送到浏览器,并告诉浏览器具体怎麽处理这个页面。
void header(string string[,bool replace[,int http_respone_code]]);//参数string 指定发送的标头。参数replace控制如果一次发送多个标头,对于相似的标头是替换还是添加。如果是false,则强制发送多个同类型的标头,默认为true。参数http_respone_code强制将HTTP响应代码设置为指定值:
下载步骤如下:
    a):通过"Content-Type" 指定文件的MIME类型。
    b):通过"Content-Disposition" 对文件进行描述,值"attachment;filename="test.jpg"" 说明是一个福建,同时指定下载文件的名称。
    c):通过"Content-Length" 设置下载文件的大小。
d):通过readfile()函数读取文件内容。
例如:
复制代码 代码如下:

header('Content-Type:image/jpg');
header(' Content-Disposition:attachment;filename="test.jpg" ');
header('Content-Length:'.filesize('test.jpg') );
readfile('test.jpg');


5.访问远程文件

  步骤1:配置 php.ini 文件选项 allow_url_fopen设置为on。参数默认是开啓的,允许打开http和ftp指定的远程文件。如果 allow_url_fopen设置为off,则不允许打开远程文件。
  步骤2:使用fopen()函数读取文件内容。根据内容创建你想要的资源,保存到本地。
        
ps:更多php.ini配置文件中的文件操作 和 目录操作的扩展方法请参考官方php指南。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn