萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> php文件上傳的應用和原理詳解

php文件上傳的應用和原理詳解

php中上傳文件必須知道幾個技巧,一個必須是由表單post過去的數據,然後由php move_uploaded_file進行接受了,再保存到服務器指定路徑即可。

1.form 標簽 enctype 屬性。

2.$_FILES 系統函數。 //將上傳內容轉換為數組。

3.move_uploaded_file 函數。 //移動存放在緩存文件夾裡的上傳文件到指定文件夾。

4.is_uploaded_file 函數。 //判斷是否存在。

---------------------------------------

1.form 標簽

格式:<form enctype="multipart/form-data" ... ...>
      <input name="upfile" type="file">

2.$_FILES 系統函數
$_FILES['name'] //客戶端上傳文件原文件名。
$_FILES['type'] //文件的MIME類型,如:“image/gif”
$_FILES['size'] //上傳文件大小,字節為單位。
$_FILES['tmp_name'] //臨時文件名,一般為默認。
$_FILES['error'] //上傳相關情況代碼(0:成功,1:超過php.ini設置大小。2:超過PHP文件代碼指定大小。3:文件只有部分被上傳。4:沒有文件被上傳。5:上傳文件大小為0。)

3.move_uploaded_file 函數
上傳後移動文件到目標位置的函數
move_uploaded_file(臨時文件,目標位置和文件名;)

4.is_uploaded_file 函數
判斷上傳MIME類型的文件函數
is_uploaded_file(MIME);

---------------------------------------

實例:

 代碼如下 復制代碼 <form enctype="multipart/form-data" action="upload.php" method="post">
<input type="hidden" name="max_file_size" value="100000">
<input name="userfile" type="file">  
<input type="submit" value="上傳文件">
</form>

注意

1、表單中enctype=”multipart/form-data”必須指定,以便讓服務器知道文件帶有常規的表單信息。
2、必須有一個可以設置上傳文件最大長度的表單區域,即允許上傳文件的最大值(按字節計算),它是隱藏值域,即max_file_size,通過設置其Value(值)可以限制上傳文件的大小,避免用戶在花時間等待上傳大文件之後才發現該文件太大了的麻煩。但是一般別人可以繞過這個值,所以安全起見,最好是在php.ini文件中配置upload_max_filesize選項,設定文件上傳的大小,默認是2M

 代碼如下 復制代碼

function uploadfile($type,$name,$ext,$size,$error,$tmp_name,$targetname,$upload_dir)
{
    $MAX_SIZE = 2000000;
    $FILE_MIMES = array('image/pjpeg','image/jpeg','image/jpg','image/gif','image/png');
    $FILE_EXTS = array('.jpg','.gif','.png','.JPG','.GIF','.PNG');

    $file_path = $upload_dir.$targetname;
   
    if(!is_dir($upload_dir))
    {
        if(!mkdir($upload_dir))
            die("文件上傳目錄不存在並且無法創建文件上傳目錄");
        if(!chmod($upload_dir,0755))
            die("文件上傳目錄的權限無法設定為可讀可寫");
    }
   
    if($size>$MAX_SIZE)
        die("上傳的文件大小超過了規定大小");

    if($size == 0)
        die("請選擇上傳的文件");

    if(!in_array($type,$FILE_MIMES) || !in_array($ext,$FILE_EXTS))
        die("請上傳符合要求的文件類型");

    if(!move_uploaded_file($tmp_name, $file_path))
        die("復制文件失敗,請重新上傳");

    switch($error)
    {
        case 0:
            return ;
        case 1:
            die("上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值");
        case 2:
            die("上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值");
        case 3:
            die("文件只有部分被上傳");
        case 4:
            die("沒有文件被上傳");
    }
}

如何上傳多個文件?比如同時上傳3個文件

 代碼如下 復制代碼

只需將


 <input name="userfile" type="file">

改成

<input name="userfile[]" type="file">
<input name="userfile[]" type="file">
<input name="userfile[]" type="file">

對應的在調用此函數時,$_FILES['userfile']['name'][0],代表第一個文件的相關文件信息,依此類推,其他也一樣。

 

一些關於php性能配置,有必須時我們也可以修改一下

max_execution_time = 30 ;每個PHP頁面運行的最大時間值(秒),默認30秒
max_input_time = 60 ;每個PHP頁面接收數據所需的最大時間,默認60秒
memory_limit = 128m ;每個PHP頁面所吃掉的最大內存,默認128M。如果覺得小了,可以設置大點。128夠用。
max_execution_time = 600
max_input_time = 600
upload_max_filesize = 32m
post_max_size = 32m

如果文件大小限制了我們可以如下解決

打開php.ini,首先找到

file_uploads = on ;是否允許通過HTTP上傳文件的開關。默認為ON即是開

upload_tmp_dir ;文件上傳至服務器上存儲臨時文件的地方,如果沒指定就會用系統默認的臨時文件夾

upload_max_filesize = 8m ;望文生意,即允許上傳文件大小的最大值。默認為2M

post_max_size = 8m ;指通過表單POST給PHP的所能接收的最大值,包括表單裡的所有值。默認為8M

一般地,設置好上述四個參數後,上傳<=8M的文件是不成問題,在網絡正常的情況下。

但如果要上傳>8M的大體積文件,只設置上述四項還一定能行的通。

 
進一步配置以下的參數

max_execution_time = 600 ;每個PHP頁面運行的最大時間值(秒),默認30秒

max_input_time = 600 ;每個PHP頁面接收數據所需的最大時間,默認60秒

memory_limit = 8m ;每個PHP頁面所吃掉的最大內存,默認8M

把上述參數修改後,在網絡所允許的正常情況下,就可以上傳大體積文件了

max_execution_time = 600
max_input_time = 600
memory_limit = 32m
file_uploads = on
upload_tmp_dir = /tmp
upload_max_filesize = 32m
post_max_size = 32m

copyright © 萬盛學電腦網 all rights reserved