1、php.ini中關于文件上傳的設置指令
2、文件上傳過程
(1)上傳文件提交表單html代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<!--向服務器上傳文件的HTML表單(限制為文本文件)--> <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "UTF-8" > <title>Adminstration - upoload new files</title> </head> <body> <h1>Upload new files</h1> <form action= "upload.php" method= "post" enctyple= "multipart/form-data" > <!--enctyple:規定在發送到服務器之前對表單數據進行編碼的方式(在上傳控件時必須按照以上方式設置該屬性)--> <div> <input type= "hidden" name= "MAX_FILE_SIZE" value= "1000000" > <!--規定傳輸文件的最大字節數--> <label for = "userfile" >Upload a file</label> <!--在<label>內點擊文本,會觸發該控件,此時瀏覽器會自動對焦到標簽 for 屬性所指向的表單控件上面--> <input type= "file" name= "userfile" id= "userfile" > <!--id屬性為<label>標簽 for 所指向控件元素的id號--> <input type= "submit" value= "Send File" > </div> </form> </body> </html> |
(2)php處理上傳文件代碼
①在php腳本中,需要處理的數據保存在超級變量數組$_FILES中,開啟register_globals指令可以直接通過變量名訪問這些信息;
②假如表單變量名為“username“則有:
$_FILES['userfile']['tmp_name']:儲存文件在Web服務器中的臨時保存位置;
$_FILES['userfile']['name']:儲存用戶系統中文件的名稱;
$_FILES['userfile']['size']:儲存文件的大??;
$_FILES['userfile']['type']:儲存文件的類型;
$_FILES['userfile']['error]:儲存任何與文件上傳相關的錯誤代碼;
錯誤類型說明:
UPLOAD_ERR_INI_SIZE:1,上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值。
UPLOAD_ERR_FORM_SIZE:2,上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。
UPLOAD_ERR_PARTIAL:3,文件只有部分被上傳。
UPLOAD_ERR_NO_FILE:4,沒有文件被上傳。
UPLOAD_ERR_NO_TMP_DIR:6,找不到臨時文件夾。PHP 4.3.10 和 PHP 5.0.3 引進。
UPLOAD_ERR_CANT_WRITE:7,文件寫入失敗。PHP 5.1.0 引進。
③php代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
<?php //檢驗文件傳輸異常 if ( $_FILES [ 'userfile' ][ 'error' ]>0){ echo 'Problem' ; switch ( $_FILES [ 'userfile' ][ 'error' ]){ case 1: echo 'File exceeded upload_max_filesize' ; break ; case 2: echo 'File exceeded max_file_size' ; break ; case 3: echo 'File only partially upload' ; break ; case 4: echo 'No file uploaded' ; break ; case 6: echo 'Cannot upload file: No temp directory specified' ; break ; case 7: echo 'Upload failed:Cannot write to disk' ; break ; } exit ; } //檢驗傳輸的文件是否為文本文件 if ( $_FILES [ 'userfile' ][ 'type' ] != 'text/plain' ){ echo 'Problem: file is not plain text' ; exit ; } //將上傳文件包含在服務器中/uploads/的目錄下(該目錄必須獨立于Web文檔樹) $upfile = '/uploads/' . $_FILES [ 'userfile' ][ 'name' ]; //在指定目錄下以傳輸文件的文件名創建一個新文件 if ( is_uploaded_file ( $_FILES [ 'userfile' ][ 'tmp_name' ])){ if (! move_uploaded_file( $_FILES [ 'userfile' ][ 'tmp_name' ], $upfile )){ //將傳輸文件的臨時文件移動到創建的新文件 echo 'Problem: Could not move file to destination directory' ; exit ; } } else { echo 'Problem: Possible file upload attack.Filename:' ; echo $_FILES [ 'username' ][ 'name' ]; exit ; } echo "File uploaded seuucessfully<br/><br/>" ; //對傳輸文件清除html和php標記 $contents = file_get_contents ( $upfile ); //將文件內容提取為一個字符串; $contents = strip_tags ( $contents ); //對該字符串擦除html和tags標記; file_put_contents ( $_FILES [ 'userfile' ][ 'name' ], $contents ); //將該字符串重新寫入文件中; //在瀏覽器上顯示傳輸的文本文件內容 echo "<p>Preview of uploaded file contents:<br/><hr>>" ; echo nl2br ( $contents ); echo "</br></hr>" ; |
3、使用目錄函數
(1)從目錄中讀取文件名
①使用opendir(),readdir(),closedir()函數;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?php $current_dir = '/uploads/' ; //創建目錄url對象 $dir = opendir( $current_dir ); //打開目錄,結果返回一個目錄對象 echo "<p>Upload directory is $current_dir</p>" ; echo "<p>Directory Listing:</p><ul>" ; while (( $file = readdir( $dir )) !== false){ //讀取目錄對象 if ( $file != "." && $file != ".." ){ //過濾當前目錄和上一級目錄 echo "<li>$file</li>" ; echo "<a href=\"filedetails.php?file=\'.$file.\'\">" . $file . "</a><br/>" ; } } echo "</ul>" ; closedir ( $dir ); //關閉目錄; ?> |
②使用php的dir類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?php $current_dir = '/uploads/' ; //創建目錄url對象 $dir = dir( $current_dir ); //創建dir對象 echo "<p>Handle is $dir->handle</p>" ; echo "<p>Upload directory is $current_dir</p>" ; echo "<p>Directory Listing:</p><ul>" ; while (( $file = $dir ->read()) !== false){ //通過dir對象讀取目錄下的文件名 if ( $file != "." && $file != ".." ){ echo "<li>$file</li>" ; } } echo "</ul>" ; $dir ->close(); //關閉目錄 ?> |
(2)使用scandir()函數對文本名稱進行字母表的排序方式
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php $current_dir = '/uploads/' ; //創建目錄url對象 $files1 = scandir( $current_dir ); //將指定目錄下的文件名保存為一個數組,默認以字母升序排序 $files2 = scandir( $current_dir ,1); //將指定目錄下的文件名保存為一個數組,以字母降序排序 echo "<p>Upload directory is $current_dir</p>" ; echo "<p>Directory Listing in alphabetical order,ascending:</p><ul>" ; foreach ( $files1 as $file1 ) { if ( $file1 != "." && $file1 != ".." ) echo "<li>$file1</li>" ; } echo "</ul>" ; ?> |
(3)獲取當前目錄的其他信息
dirname($path):返回路徑的目錄部分;
basename($path):返回路徑的名稱部分;
disk_free_space($path):返回路徑所在磁盤可以保存上傳文件的容量;
(4)創建和刪除目錄
①mkdir():創建目錄;
代碼:
1
2
3
|
$oldumask = umask(0); //重置當前權限碼 mkdir ( "/tmp/testing" ,0777); //創建目錄 umask( $oldumask ); //恢復當前權限碼 |
②rmdir():刪除目錄;
代碼:
1
2
|
rmdir ( "/temp/testing" ); 或 rmdir ("c:\\tmp\\testing'); |
※要刪除的目錄必須是空目錄;
4、與文件系統的交互
(1)獲取文件信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
while (( $file = readdir( $dir )) !== false){ echo "<a href=\"filedetails.php?file=\'.$file.\'\">" . $file . "</a><br/>" ; } <?php $current_dir = '/uploads/' ; $file = basename ( $file ); //獲取文件文件名 echo "<h1>Details of file</h1>" ; echo "<h2>File data</h2>" ; echo 'File last accessed: ' . date ( 'j F Y H:i' , fileatime ( $file )). "<br>" ; //返回最近訪問的時間戳 echo 'File last modifixed: ' . date ( 'j F Y H:i' , filemtime ( $file )). "<br>" ; //返回最近修改的時間戳 $user = posix_getpwuid( fileowner ( $file )); //返回用戶標識uid echo 'File owner: ' . $user [ 'name' ]. "<br/>" ; $group = posix_getgrgid( filegroup ( $file )); //返回組織標識gid echo 'File group: ' . $group [ 'name' ]. "<br/>" ; echo 'File permissions: ' . decoct ( fileperms ( $file )). "<br/>" ; //返回8位的權限碼 echo 'File type' . filetype ( $file ). "<br/>" ; //返回文件類型 echo 'File size' . filesize ( $file ). "<br/>" ; //返回文件字節數 echo "<h2>File Tests</h2>" ; echo 'is_dir?' .( is_dir ( $file ) ? 'true' : 'false' ). "<br/>" ; echo 'is_executable?' .( is_executable ( $file ) ? 'true' : 'false' ). "<br/>" ; //判斷文件是否可執行; echo 'is_file?' .( is_file ( $file ) ? 'true' : 'false' ). "<br/>" ; echo 'is_link?' .( is_link ( $file ) ? 'true' : 'false' ). "<br/>" ; echo 'is_readable?' .( is_readable ( $file ) ? 'true' : 'false' ). "<br/>" ; echo 'is_writable?' .( is_writable ( $file ) ? 'true' : 'false' ). "<br/>" ; ?> |
(2)更改文件屬性
chgrp(file,group):修改文件的分組;
chmod(file,permissions):修改文件的權限;
chown(file,user):修改文件的所有者;
(3)創建、刪除和移動文件
bool touch($filename,[int time,[ int atime]]):創建一個文件(time指定創建時間戳,atime指定可選時間戳)
unlink($filename):刪除一個文件
copy($source_path,$destination_path):復制一個文件
rename($oldfile,$newfile):重命名一個文件;
(4)使用程序執行函數
①String exec(String command[ ,array result [ ,int result_value]])
返回命名結果的最后一行,result變量可以返回字符組數,這些字符串代表輸出的每一行,result_value獲取返回代碼;
②void passthru(String command[ ,int result_value])
結果直接輸出到瀏覽器;
③String system(string command[ ,int return_value])
輸出結果到瀏覽器,返回命令結果的最后一行或false;
※在用戶提交的數據包括執行命令的一部分,應該進行以下包裝:
system(escapeshellcmd($command));
5、與環境變量交互
phpinfo()函數:獲取php的所有變量列表;
getenv("$key_name"):
setenv("$key_name=$value");
以上所述是小編給大家介紹的PHP與服務器文件系統的簡單交互,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!