日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php 函数封装上传,PHP(多)文件上传实现和函数封装

發布時間:2024/7/5 php 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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(多)文件上传实现和函数封装的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。