php實現(xiàn)上傳進(jìn)度條的方法:首先向服務(wù)器端上傳一個文件;然后用php將此次文件上傳的詳細(xì)信息存儲在session當(dāng)中;接著用ajax周期性的請求一個服務(wù)器端腳本;最后通過瀏覽器端的javascript顯示更新進(jìn)度條即可。
推薦:《php視頻教程》
實現(xiàn)文件上傳進(jìn)度條基本是依靠js插件或html5的file api來完成,其實php配合ajax也能實現(xiàn)此功能。
php手冊對于session上傳進(jìn)度是這么介紹的:
當(dāng) session.upload_progress.enabled ini 選項開啟時,php 能夠在每一個文件上傳時監(jiān)測上傳進(jìn)度。 這個信息對上傳請求自身并沒有什么幫助,但在文件上傳時應(yīng)用可以發(fā)送一個post請求到終端(例如通過xhr)來檢查這個狀態(tài) 當(dāng)一個上傳在處理中,同時post一個與ini中設(shè)置的session.upload_progress.name同名變量時,上傳進(jìn)度可以在$_session中獲得。 當(dāng)php檢測到這種post請求時,它會在$_session中添加一組數(shù)據(jù), 索引是 session.upload_progress.prefix 與 session.upload_progress.name連接在一起的值。 通常這些鍵值可以通過讀取ini設(shè)置來獲得,例如 <?php$key = ini_get("session.upload_progress.prefix") . ini_get("session.upload-progress.name");var_dump($_session[$key]);?> 通過將$_session[$key]["cancel_upload"]設(shè)置為true,還可以取消一個正在處理中的文件上傳。 當(dāng)在同一個請求中上傳多個文件,它僅會取消當(dāng)前正在處理的文件上傳和未處理的文件上傳,但是不會移除那些已經(jīng)完成的上傳。 當(dāng)一個上傳請求被這么取消時,$_files中的error將會被設(shè)置為 upload_err_extension。 session.upload_progress.freq 和 session.upload_progress.min_freq ini選項控制了上傳進(jìn)度信息應(yīng)該多久被重新計算一次。 通過合理設(shè)置這兩個選項的值,這個功能的開銷幾乎可以忽略不計。 注意:為了使這個正常工作,web服務(wù)器的請求緩沖區(qū)需要禁用,否則 php可能僅當(dāng)文件完全上傳完成時才能收到文件上傳請求。 已知會緩沖這種大請求的程序有nginx。下面原理介紹:
當(dāng)瀏覽器向服務(wù)器端上傳一個文件時,php將會把此次文件上傳的詳細(xì)信息(如上傳時間、上傳進(jìn)度等)存儲在session當(dāng)中。然后,隨著上傳的進(jìn)行,周期性的更新session中的信息。這樣,瀏覽器端就可以使用ajax周期性的請求一個服務(wù)器端腳本,由該腳本返回session中的進(jìn)度信息;瀏覽器端的javascript即可根據(jù)這些信息顯示/更新進(jìn)度條了。
php.ini需配置以下選項
session.upload_progress.enabled = "1"session.upload_progress.cleanup = "1"session.upload_progress.prefix = "upload_progress_"session.upload_progress.name = "php_session_upload_progress"session.upload_progress.freq = "1%"session.upload_progress.min_freq = "1"其中enabled控制upload_progress功能的開啟與否,默認(rèn)開啟;
cleanup 則設(shè)置當(dāng)文件上傳的請求提交完成后,是否清除session的相關(guān)信息,默認(rèn)開啟,如果需要調(diào)試$_session,則應(yīng)該設(shè)為off。
prefix 和 name 兩項用來設(shè)置進(jìn)度信息在session中存儲的變量名/鍵名。
freq 和 min_freq 兩項用來設(shè)置服務(wù)器端對進(jìn)度信息的更新頻率。合理的設(shè)置這兩項可以減輕服務(wù)器的負(fù)擔(dān)。
在上傳文件的表單中,需要為該次上傳設(shè)置一個標(biāo)識符,并在接下來的過程中使用該標(biāo)識符來引用進(jìn)度信息。
具體的,在上傳表單中需要有一個隱藏的input,它的name屬性為php.ini中 session.upload_progress.name 的值;它的值為一個由你自己定義的標(biāo)識符。如下:
代碼如下:
<input type="hidden" name="<?php echo ini_get('session.upload_progress.name'); ?>" value="test" />接到文件上傳的表單后,php會在$_session變量中新建鍵,鍵名是一個將session.upload_progress.prefix的值與上面自定義的標(biāo)識符連接后得到的字符串,可以這樣得到:
代碼如下:
$name = ini_get('session.upload_progress.name');$key = ini_get('session.upload_progress.prefix') . $_post[$name];$_session[$key]; // 這里就是此次文件上傳的進(jìn)度信息了$_session[$key]這個變量的結(jié)構(gòu)是這樣的:
array ( 'upload_progress_test' => array ( 'start_time' => 1491494993, // 開始時間 'content_length' => 1410397, // post請求的總數(shù)據(jù)長度 'bytes_processed' => 1410397, // 已收到的數(shù)據(jù)長度 'done' => true, // 請求是否完成 true表示完成,false未完成 'files' => array ( 0 => array ( 'field_name' => 'file1', 'name' => 'test.jpg', 'tmp_name' => 'd:\\\\\\\\wamp\\\\\\\\tmp\\\\\\\\phpe181.tmp', 'error' => 0, 'done' => true, 'start_time' => 1491494993, 'bytes_processed' => 1410096, ), ), ),);這樣,我們就可以使用其中的 content_length 和 bytes_processed 兩項來得到進(jìn)度百分比。
原理介紹完了,下面我們來完整的實現(xiàn)一個基于php和javascript的文件上傳進(jìn)度條。
上傳表單index.php
<?php session_start(); ?><!doctype html><html lang="zh-cn"><head> <meta charset="utf-8"> <title>php(5.4) session 上傳進(jìn)度 demo</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="keywords" content=""/> <meta name="description" content=""/> <meta name="author" content=""> <link href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.2/css/bootstrap.min.css" rel="stylesheet"> <style type="text/css"> body{ font-size:1e
怎樣進(jìn)行域名交易?域名買賣要注意什么?epic下載慢如何解決 epic下載慢的解決教程幾個月前從你們這轉(zhuǎn)出了-其他問題自適應(yīng)與響應(yīng)式網(wǎng)站建設(shè)\"阿里云國際站的國內(nèi)服務(wù)器能買請問以下營業(yè)執(zhí)照的公司如果備案的話需不需要什么特殊的資質(zhì)呢海外米商挖掘域名價值:看好工作類域名請幫我查一下這個域名綁定到哪個服務(wù)器了謝謝