在php中文件上傳我們由html客戶端與服務(wù)器端php處理組成,中間會(huì)有一些由files全局變量對(duì)數(shù)據(jù)判斷與移動(dòng)操作,下面一起來看看.
$_FILES參數(shù)詳解:
$_FILES["file"]["name"] – 被上傳文件的名稱
$_FILES["file"]["type"] – 被上傳文件的類型
$_FILES["file"]["size"] – 被上傳文件的大小,以字節(jié)計(jì)
$_FILES["file"]["tmp_name"] – 存儲(chǔ)在服務(wù)器的文件的臨時(shí)副本的名稱
$_FILES["file"]["error"] – 由文件上傳導(dǎo)致的錯(cuò)誤代碼
$_FILES["file"]["error"]中的["error"]值情況:
html客戶端
1.客戶端上傳設(shè)置
文件上傳的最基本方法,是使用HTML表單選擇本地文件進(jìn)行提交,在form表單中可以通過<input type=”file”>標(biāo)記選擇本地文件,如果支持文件上傳操作,必須在<form>標(biāo)簽中將enctype和method兩個(gè)屬性指明相應(yīng)的值,如下所示:
★enctype=”multipart/form-data”用來指定表單編碼數(shù)據(jù)方式,讓服務(wù)器知道,我們要傳遞一個(gè)文件,并帶有常規(guī)的表單信息。
★method=”POST”用來指明發(fā)送數(shù)據(jù)的方法.
另外,還需要在form表單中設(shè)置一個(gè)hidden類型的input框,其中name的值為MAX_FILL_SIZE的隱藏值域,并通過設(shè)置其VALUE的值限制上傳文件的大小(單位字節(jié)),但這個(gè)值不能超過PHP的配置文件中upload_max_filesize值設(shè)置的大小,文件上傳表單代碼如下所示:
- <html>
- <head><title>文件上傳</title></head>
- <body>
- <form action='upload.php' method="post" enctype="multipart/form-data">
- <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
- 選擇文件<input type="file" name="上傳文件">
- </form>
- </body>
- </html>
upload.php服務(wù)器端,代碼如下:
- <?php
- $allowtype = array('gif','png','jpg');
- $size = 1000000;
- $path = "./uploads"; //設(shè)置上傳后保存文件的路徑
- //判斷文件是否可以成功上傳到服務(wù)器,$_FILES['myfile']['error']為0則表示上傳成功
- if ($_FILES['myfile']['error']>0){
- echo '上傳錯(cuò)誤:';
- switch($_FILES['myfile']['error']){
- case 1: die('上傳文件大小超出了PHP配置文件中的約定值:upload_max_filesize');break;
- case 2:die('上傳文件大小超出表單中的約定值:MAX_FILE_SIZE');break;
- case 3: die('上傳文件只部分被上載');break;
- case 4: die('沒有上傳任何文件');break;
- default:die('未知錯(cuò)誤');
- }
- }
- //判斷上傳的文件是否為允許的文件類型,通過文件名的后綴名
- $hz = array_pop(explode(".",$_FILES['myfile']['name']));
- //通過判斷文件的后綴方式,來確定文件是否是允許上傳的文件類型
- if(!in_array($hz, $allowtype)){
- die("這個(gè)后綴是<b>($hz)</b>,不是允許的文件類型");
- }
- //判斷上傳的文件是否為允許大小
- if($_FILES['myfile']['size']> $size){
- die("超過了允許的<b>{$size}</b>字節(jié)大小");
- }
- //為了系統(tǒng)安全,也為了同名文件不會(huì)被覆蓋,上傳后將文件名實(shí)用系統(tǒng)定義
- $filename = data("YmdHis").rand(100, 900).".".$hz;
- //開源軟件:Vevb.com
- //判斷是否為上傳文件
- if(is_uploaded_file($_FILES['myfile']['tmp_name'])){
- if(!move_uploaded_file($_FILES['myfile']['tmp_name'], $path.'/'.$filename)){
- die('問題:不能將文件移動(dòng)到指定目錄。');
- }
- }else{
- die("問題:上傳文件{$_FILES['myfile']['name']}不是一個(gè)合法的文件:");
- }
- //如果文件上傳成功則輸出
- echo "文件{$upfile}上傳成功,保存在目錄{$path}中,大小為{$_FILES['myfile']['size']}字節(jié)";
- ?>
如果我們要多文件上傳只要簡(jiǎn)單對(duì)于html上傳表單以數(shù)據(jù)形式操作,代碼如下:
- <form action="" method="post" enctype="multipart/form-data">
- <input type="hidden" name="MAX_FILE_SIZE" value="">
- <input type="file" name="pic[]" /><br><br>
- <input type="file" name="pic[]" /><br><br>
- <input type="file" name="pic[]" /><br><br>
- <input type="file" name="pic[]" /><br><br>
- <input type="submit" value="upload"/>
- </form>
然后對(duì)于upload.php處理文件我們只要遍歷數(shù)組pic[]就可以了.
- for($i=0;$i<count($up_info['name']);$i++){
- }
- //這樣//foreach 循環(huán)處理多個(gè)文件上傳
①函數(shù)is_uploaded_file()
該函數(shù)判斷指定的文件是否是通過HTTP POST上傳的,如果是則返回TRUE。用于防止?jié)撛诘墓粽邔?duì)原本不能通過腳本交互的文件進(jìn)行非法管理,這可以用來確保惡意的用戶無(wú)法欺騙腳本去訪問本不能訪問的文件,例如/etc/passwd。此函數(shù)的原型如下所示:
bool is_uploaded_file(string) //判斷指定的文件是否是通過HTTP POST上傳的
為了能使此函數(shù)正常工作,唯一的參數(shù)必須指定類似于$_FILES['userfile']['tmp_name']的變量,才能判斷指定的文件確實(shí)是上傳文件。如果使用從客戶端上傳的文件名$_FILES['userfile']['name']則不能正常運(yùn)作。
PHP上傳文件大小限制解決方法:
第一:在php.ini里面查看如下行:
- upload_max_filesize = 8M
- post_max_size = 10M
- memory_limit = 20M
把這些值改成我所說的,看看有沒有問題,另外要確認(rèn)上傳的 <form> 里沒有類似下面的這行<input type="hidden" name="MAX_FILE_SIZE" value="500000">這樣也是限制上傳大小用的.
第二:如果是apache 2 需要修改
/etc/httpd/conf.d/php.conf
中的LimitRequestBody 524288將524288(=512×1024)改大,比如5M(=5×1024×1024)這樣上傳就不會(huì)出現(xiàn)如上問題,上傳不響應(yīng),上傳現(xiàn)實(shí)該頁(yè)無(wú)法現(xiàn)實(shí)也將得到解決.
新聞熱點(diǎn)
疑難解答