在php中文件上傳我們由html客戶端與服務器端php處理組成,中間會有一些由files全局變量對數據判斷與移動操作,下面一起來看看.
$_FILES參數詳解:
$_FILES["file"]["name"] – 被上傳文件的名稱
$_FILES["file"]["type"] – 被上傳文件的類型
$_FILES["file"]["size"] – 被上傳文件的大小,以字節計
$_FILES["file"]["tmp_name"] – 存儲在服務器的文件的臨時副本的名稱
$_FILES["file"]["error"] – 由文件上傳導致的錯誤代碼
$_FILES["file"]["error"]中的["error"]值情況:
html客戶端
1.客戶端上傳設置
文件上傳的最基本方法,是使用HTML表單選擇本地文件進行提交,在form表單中可以通過<input type=”file”>標記選擇本地文件,如果支持文件上傳操作,必須在<form>標簽中將enctype和method兩個屬性指明相應的值,如下所示:
★enctype=”multipart/form-data”用來指定表單編碼數據方式,讓服務器知道,我們要傳遞一個文件,并帶有常規的表單信息。
★method=”POST”用來指明發送數據的方法.
另外,還需要在form表單中設置一個hidden類型的input框,其中name的值為MAX_FILL_SIZE的隱藏值域,并通過設置其VALUE的值限制上傳文件的大小(單位字節),但這個值不能超過PHP的配置文件中upload_max_filesize值設置的大小,文件上傳表單代碼如下所示:
- <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服務器端,代碼如下:
- <?php
- $allowtype = array('gif','png','jpg');
- $size = 1000000;
- $path = "./uploads"; //設置上傳后保存文件的路徑
- //判斷文件是否可以成功上傳到服務器,$_FILES['myfile']['error']為0則表示上傳成功
- if ($_FILES['myfile']['error']>0){
- echo '上傳錯誤:';
- 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('未知錯誤');
- }
- }
- //判斷上傳的文件是否為允許的文件類型,通過文件名的后綴名
- $hz = array_pop(explode(".",$_FILES['myfile']['name']));
- //通過判斷文件的后綴方式,來確定文件是否是允許上傳的文件類型
- if(!in_array($hz, $allowtype)){
- die("這個后綴是<b>($hz)</b>,不是允許的文件類型");
- }
- //判斷上傳的文件是否為允許大小
- if($_FILES['myfile']['size']> $size){
- die("超過了允許的<b>{$size}</b>字節大小");
- }
- //為了系統安全,也為了同名文件不會被覆蓋,上傳后將文件名實用系統定義
- $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('問題:不能將文件移動到指定目錄。');
- }
- }else{
- die("問題:上傳文件{$_FILES['myfile']['name']}不是一個合法的文件:");
- }
- //如果文件上傳成功則輸出
- echo "文件{$upfile}上傳成功,保存在目錄{$path}中,大小為{$_FILES['myfile']['size']}字節";
- ?>
如果我們要多文件上傳只要簡單對于html上傳表單以數據形式操作,代碼如下:
- <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>
然后對于upload.php處理文件我們只要遍歷數組pic[]就可以了.
- for($i=0;$i<count($up_info['name']);$i++){
- }
- //這樣//foreach 循環處理多個文件上傳
①函數is_uploaded_file()
該函數判斷指定的文件是否是通過HTTP POST上傳的,如果是則返回TRUE。用于防止潛在的攻擊者對原本不能通過腳本交互的文件進行非法管理,這可以用來確保惡意的用戶無法欺騙腳本去訪問本不能訪問的文件,例如/etc/passwd。此函數的原型如下所示:
bool is_uploaded_file(string) //判斷指定的文件是否是通過HTTP POST上傳的
為了能使此函數正常工作,唯一的參數必須指定類似于$_FILES['userfile']['tmp_name']的變量,才能判斷指定的文件確實是上傳文件。如果使用從客戶端上傳的文件名$_FILES['userfile']['name']則不能正常運作。
PHP上傳文件大小限制解決方法:
第一:在php.ini里面查看如下行:
- upload_max_filesize = 8M
- post_max_size = 10M
- memory_limit = 20M
把這些值改成我所說的,看看有沒有問題,另外要確認上傳的 <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)這樣上傳就不會出現如上問題,上傳不響應,上傳現實該頁無法現實也將得到解決.
新聞熱點
疑難解答