您的位置:首頁>正文

七、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

選擇要上傳的檔:

需要注意的是enctype屬性的值以及file控制項裡的name屬性, 這是用來標識上傳的檔的。 該表單的處理腳本如下:

dealfileupload.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 系統函數

圖片來源於網路

在這裡要注意, $_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

選擇要上傳的檔1:

選擇要上傳的檔2:

dealfilesupload.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 "
";

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.''
'';

(7)float disk_total_space(string directory) ,獲取指定磁片總空間

例:$df=disk_total_space("F:");

echo $df.''
'';

(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 "

";

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

{

echo "

";

}

echo "

數字下標關鍵(自PHP 5.1.4)
".$num."".$info."
";

(13)string filetype(string filename) ,獲取文件的類型

例:echo filetype($filename);

(14)bool is_dir(string filename) ,判斷給定的檔案名是否是一個目錄

例:if(is_dir($filename))

echo $filename.''為目錄
'';

else

echo $filename.''非目錄
'';

(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。

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

echo fgetss($file,1024,"

,");//保留p和b標記

fclose($file);

?>

(20) string fgets()

fgets() 函數從檔指標中讀取一行。file 必需。規定要讀取的文件。length 可選。規定要讀取的位元組數; 預設是 1024 位元組。

從 file 指向的文件中讀取一行並返回長度最多為 length - 1 位元組的字串。碰到分行符號(包括在返回值中)、EOF 或者已經讀取了 length - 1 位元組後停止(要看先碰到那一種情況)。如果沒有指定 length,則默認為 1K,或者說 1024 位元組。

若失敗,則返回 false。

4、遍歷資料夾中的文件

$dir=opendir(''資料夾路徑名'');//打開資料夾,返回一個資料夾物件(控制碼)

while($fileName=readdir($dir))//readdir(參數是用opendir打開的資料夾對象名),每執行一次都會

取出指定資料夾中的一個檔案名稱,且檔指標向下移動一個

{

echo ''fileName=''.$fileName. ''
'';//輸出取得的檔案名

}

?>

opendir() 函數返回一個目錄控制碼即資料夾物件,可由 closedir(),readdir() 和 rewinddir() 使用。

若成功,則該函數返回一個目錄流,否則返回 false 以及一個 error。可以通過在函數名前加上 "@" 來隱藏 error 的輸出。

readdir() 函數返回由 opendir() 打開的目錄控制碼中的檔案名稱。若成功,則該函數返回一個檔案名,否則返回 false。

5、檔上傳成功後要清除其所佔用的記憶體,方法是使用imagedestroy()函數。詳見手冊

如檔案名以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.''
'';

(7)float disk_total_space(string directory) ,獲取指定磁片總空間

例:$df=disk_total_space("F:");

echo $df.''
'';

(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 "

";

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

{

echo "

";

}

echo "

數字下標關鍵(自PHP 5.1.4)
".$num."".$info."
";

(13)string filetype(string filename) ,獲取文件的類型

例:echo filetype($filename);

(14)bool is_dir(string filename) ,判斷給定的檔案名是否是一個目錄

例:if(is_dir($filename))

echo $filename.''為目錄
'';

else

echo $filename.''非目錄
'';

(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。

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

echo fgetss($file,1024,"

,");//保留p和b標記

fclose($file);

?>

(20) string fgets()

fgets() 函數從檔指標中讀取一行。file 必需。規定要讀取的文件。length 可選。規定要讀取的位元組數; 預設是 1024 位元組。

從 file 指向的文件中讀取一行並返回長度最多為 length - 1 位元組的字串。碰到分行符號(包括在返回值中)、EOF 或者已經讀取了 length - 1 位元組後停止(要看先碰到那一種情況)。如果沒有指定 length,則默認為 1K,或者說 1024 位元組。

若失敗,則返回 false。

4、遍歷資料夾中的文件

$dir=opendir(''資料夾路徑名'');//打開資料夾,返回一個資料夾物件(控制碼)

while($fileName=readdir($dir))//readdir(參數是用opendir打開的資料夾對象名),每執行一次都會

取出指定資料夾中的一個檔案名稱,且檔指標向下移動一個

{

echo ''fileName=''.$fileName. ''
'';//輸出取得的檔案名

}

?>

opendir() 函數返回一個目錄控制碼即資料夾物件,可由 closedir(),readdir() 和 rewinddir() 使用。

若成功,則該函數返回一個目錄流,否則返回 false 以及一個 error。可以通過在函數名前加上 "@" 來隱藏 error 的輸出。

readdir() 函數返回由 opendir() 打開的目錄控制碼中的檔案名稱。若成功,則該函數返回一個檔案名,否則返回 false。

5、檔上傳成功後要清除其所佔用的記憶體,方法是使用imagedestroy()函數。詳見手冊

Next Article
©2016 華文網. All Rights Reserved. 版權&隱私條款 | 聯繫我們 | 網站地圖
免責聲明:本網站是以實時上傳文章的方式運作,本站對所有文章的真實性、完整性及立場等,不負任何法律責任。而一切文章內容只代表發文者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。發文者擁有在本站張貼的文章。由於本站是受到「實時發表」運作方式所規限,故不能完全監查所有即時文章,若讀者發現有留言出現問題,請聯絡我們。本站有權刪除任何內容及拒絕任何人士發文,同時亦有不刪除文章的權力。切勿撰寫粗言穢語、毀謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。
喜欢就按个赞吧!!!
点击关闭提示