php 函数封装上传,PHP(多)文件上传实现和函数封装
一、PHP 文件上傳的相關知識
對 PHP 文件上傳的相關知識總結主要是參考老師演示的代碼和 drawer.php(某大神寫的 PHP 單文件版的服務器文件管理端)
1. php 關于文件上傳的配置文件上傳項目項在php.ini中設置,常用的配置項有:
序號
配置項
默認值
描述
1
file_uploads
On
使 PHP 支持文件上傳
2
upload_tmp_dir
/tmp
指示應該臨時把上傳的文件存儲在什么位置
3
max_file_uploads
20
單次請求時允許上傳的最大文件數量
4
max_execution_time
30
設置腳本被解析器終止之前 PHP 最長執行時間(秒) ,防止服務器資源被耗盡
5
max_input_time
60
設置 PHP 通過 POST/GET/PUT 解析接收數據的時長(秒)
6
memory_limit
128M
系統分配給當前腳本執行可用的最大內存容量
7
post_max_size
8M
允許的 POST 數據的總大小
8
upload_max_filesize
32M
允許的盡可能最大的文件上傳
2. 服務端超全局變量$_FILES上傳文件的描述信息,全部保存在系統全局變量$_FILES中
$_FILES以二維數組形式保存: $_FILES['form_file_name']['key']
'form_file_name': 對應著表單中中name屬性值
'key': 共有 5 個鍵名, 描述如下:
序號
鍵名
描述
1
name
文件在客戶端的原始文件名(即存在用戶電腦上的文件名)
2
type
文件的 MIME 類型, 由瀏覽器提供, PHP 并不檢查它
3
tmp_name
文件被上傳到服務器上之后,在臨時目錄中臨時文件名
4
error
和該文件上傳相關的錯誤代碼
5
size
已上傳文件的大小(單位為字節)
文件上傳錯誤信息描述
序號
常量
值
描述
1
UPLOAD_ERR_OK
0
沒有錯誤發生,文件上傳成功
2
UPLOAD_ERR_INI_SIZE
1
文件超過php.ini中upload_max_filesize值
3
UPLOAD_ERR_FORM_SIZE
2
文件大小超過表單中MAX_FILE_SIZE指定的值
4
UPLOAD_ERR_PARTIAL
3
文件只有部分被上傳
5
UPLOAD_ERR_NO_FILE
4
沒有文件被上傳
6
UPLOAD_ERR_NO_TMP_DIR
6
找不到臨時文件夾
7
UPLOAD_ERR_CANT_WRITE
7
文件寫入失敗
3、介紹一些常用的 PHP 函數與 php.ini 配置相關的函數: 我們知道修改 php.ini 后要重啟服務,但修改配置一般是某些頁面需求,再者一般也不建議隨意修改 php.ini 的配置文件。PHP 提供了 ini 為前綴的函數,修改配置僅對當前頁面有效,頁面釋放后就無效了,非常適合我們平常使用。
ini_set(string $varname,string $newvalue):string 設置指定配置選項的值。這個選項會在腳本運行時保持新的值,并在腳本結束時恢復。簡單的說就是可以臨時修改 pnp.ini 配置文件中的值,頁面結束時恢復 。這樣就可以不用去修改 php.ini 的默認配置了,畢竟它是全局的,影響機器上所有 PHP 服務,而我們改變一般都是針對當前需求的,所以使用它修改比較合適。
ini_get(string $varname):string獲取一個配置選項的值,ini_get_all([ string $extension[, bool $details = true]]):array獲取所有已注冊的配置選項,get_cfg_var(string $option):mixed獲取 PHP 配置選項 option 的值,此函數不會返回 PHP 編譯的配置信息,或從 Apache 配置文件讀取。
ini_restore(string $varname):void 恢復指定的配置選項到它的原始值。
//限制可訪問目錄,避免惡意修改
ini_set('open_basedir',__DIR__);//僅在當前頁面中應用該配置,不影響PHP.ini配置文件中設置,頁面結束后就無效了。
echo ini_get('open_basedir'),'
';
ini_set('max_file_uploads','30');//設置無效
echo ini_get('max_file_uploads'),'
';
補充: 本以為可以設置文件上傳相關配置,經測試發現無效,查 PHP 官方只有可修改范圍是 PHP_INI_ALL 才可以被 ini_set 修改。就當了解知道吧。
與目錄或文件相關的函數: PHP 內置大量的文件系統操作函數,在一篇類的自動加載時已經介紹過了 is_file 和 file_exists 函數,下面再介紹與上傳文件相關的函數
目錄相關的函數:is_dir()判斷給定文件名是否是一個目錄,如果文件名存在,并且是個目錄返回 true,否則返回 false。opendir()、 closedir()、readdir()和rewinddir()對目錄進行遍歷。rmdir()刪除目錄,mkdir新建目錄。
/**
* 遍歷出所有文件或文件夾
* @access public
* @param string $dira 要遍歷的文件夾名
* @return array
*/
functiontraverseDir($dira){
$arr=array();
if($dh=opendir($dira)){
while(($file=readdir($dh))!==false){
if(($file!='.')&&($file!='..')&&is_dir($dira.'/'.$file)){
$arr[]=$dira.'/'.$file;
foreach(traverseDir($dira.'/'.$file)as$v){
$arr[]=$v;
}
}
clearstatcache();
}
}
return$arr;
}
printf("
%s",print_r(traverseDir('F:/120910'),true));文件相關的函數: 判斷就是 is_file 和 file_exists 兩個函數了。copy()復制文件,如果目標文件已存在,將會被覆蓋。這里重點說下對上傳臨時文件的操作函數即tmp_name鍵名的臨時文件getimagesize(臨時文件) 檢驗是否真實圖片,可防止修改擴展名偽裝圖片
is_uploaded_file(臨時文件) 判斷文件是否是通過 HTTP POST 上傳的,如果 filename 所給出的文件是通過 HTTP POST 上傳的則返回 true。這可以用來確保惡意的用戶無法欺騙腳本去訪問本不能訪問的文件,例如/etc/passwd。
move_uploaded_file(臨時文件,目標文件 將上傳的文件移動到新位置。
if(!getimagesize($fileInfo['tmp_name']))die('不是真實圖片,get out~');
if(!is_uploaded_file($fileInfo['tmp_name']))die('上傳方式錯誤:請使用http post方式上傳');
if(!move_uploaded_file($fileInfo['tmp_name'],$fileRealPath))die('文件上傳失敗');
路徑相關的函數:basename(string $path[,string $suffix]):string給出一個包含有指向一個文件的全路徑的字符串,本函數返回基本的文件名。
dirname(string $path[,int $levels = 1]):string給出一個包含有指向一個文件的全路徑的字符串,本函數返回去掉文件名后的目錄名,且目錄深度為 levels 級。
pathinfo(string $path[,int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ]):mixed返回一個關聯數組包含有 path 的信息。返回關聯數組還是字符串取決于 options。本函數檢查并確保由 filename 指定的文件是合法的上傳文件(即通過 PHP 的 HTTP POST 上傳機制所上傳的)。如果文件合法,則將其移動為由 destination 指定的文件。
// 路徑
echo basename("/etc/sudoers.d").PHP_EOL;
echo basename("/etc/sudoers.d",".d").PHP_EOL;//如果文件名是以第二個參數結束的,那這一部分也會被去掉
echo dirname("/etc/passwd").PHP_EOL;
echo dirname("/usr/local/lib",2).PHP_EOL;//第二個參數指示深度(PHP7.0開始支持)
$path_parts=pathinfo('/www/htdocs/inc/lib.inc.php');
echo $path_parts['dirname'].PHP_EOL;//返回/www/htdocs/inc
echo $path_parts['basename'].PHP_EOL;//返回lib.inc.php
echo $path_parts['extension'].PHP_EOL;//返回php
echo $path_parts['filename'].PHP_EOL;//返回lib.inc
二、PHP(多)文件上傳前端的實現
1、功能和源碼功能描述:
可選擇一個文件,也可選擇多個文件
若選擇文件是圖片則提供預覽功能
對選擇文件可進行上傳服務端
.container{
width:70vw;
min-width:600px;
margin:3emauto;
background-color:#007d20;
color:white;
font-size:1.1em;
padding:0.5em1em3em;
border-radius:1em;
}
.container h2{
text-align:center;
margin:0;
padding:0;
border:none;
}
form fieldset{
display:flex;
justify-content:space-between;
}
form fieldset#image {
flex-flow:row wrap;
justify-content:initial;
/* flex其實也有彈性單元的概念,不過這不是官方的說法,它的提出是我學習Grid時發現的,只是它是交叉方向的,不設置默認是拉伸stretch */
/* 在項目中若不設置,則圖片寬度和高度都一樣,這樣有的圖片就被拉伸了,不是按圖片比例縮放 */
align-items:center;
}
form fieldset#image img {
margin:5px10px;
}
PHP實現的(多)文件上傳
選擇上傳文件
上傳服務器
總結
以上是生活随笔為你收集整理的php 函数封装上传,PHP(多)文件上传实现和函数封装的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zillow房价预测比赛_Kaggle竞
- 下一篇: 测试一体机风扇分贝软件,9款小风扇深度横