程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP多文件上傳操作,

PHP多文件上傳操作,

編輯:關於PHP編程

PHP多文件上傳操作,


在前一篇文章裡講到了關於PHP文件上傳原理和簡單操作舉例是單文件上傳。

http://www.cnblogs.com/lichenwei/p/3879566.html

其實多文件上傳和單文件上傳大同小異,原理都是一樣的,只是在代碼上做了點小技巧。

 

首先還是index.html上傳表單,只是把之前上傳文件表單裡的file更改成了file[]

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>upload files</title>
</head>
<body>

    <form action="upload.php" enctype="multipart/form-data" method="post">
        <input type="hidden" name="MAX_FILE_SIZE" value="100000" />
        上傳文件:<input type="file" name="file[]"/><br/>
        上傳文件:<input type="file" name="file[]"/><br/>
        上傳文件:<input type="file" name="file[]"/><br/>    
        <input type="submit" value="上傳" />
    </form>
</body>
</html>

在upload.php用$_FILES打印看看

<?php  
  print_r($_FILES);
?>

得出下面多維數組

Array
(
    [file] => Array
        (
            [name] => Array
                (
                    [0] => 照片1.jpg
                    [1] => 照片2.jpg
                    [2] => 照片3.jpg
                )

            [type] => Array
                (
                    [0] => image/jpeg
                    [1] => image/jpeg
                    [2] => image/jpeg
                )

            [tmp_name] => Array
                (
                    [0] => F:\wamp\tmp\php36C7.tmp
                    [1] => F:\wamp\tmp\php36C8.tmp
                    [2] => F:\wamp\tmp\php36C9.tmp
                )

            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                )

            [size] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                )

        )

)

按照單文件上傳的原理,先想想我們需要得到什麼?

很明顯我們需要得到一個關於文件信息的數組,數組裡包含name,type,tmp_name,error,size,而此時我們得到的是個多維數組,雖然對應的鍵值都存在,但它是多維的,

我們只需要把它拆分,比如上面的3個文件,我們只需要把它拆分成對應的3個文件信息數組就行了。

拆分數組的結構

Array
(
    [0] => Array
        (
            [name] => 照片1.jpg
            [type] => image/jpeg
            [tmp_name] => F:\wamp\tmp\php13C1.tmp
            [error] => 0
            [size] => 385150
        )

    [1] => Array
        (
            [name] => 照片2.jpg
            [type] => image/jpeg
            [tmp_name] => F:\wamp\tmp\php13D2.tmp
            [error] => 0
            [size] => 242043
        )

    [2] => Array
        (
            [name] => 照片3.jpg
            [type] => image/jpeg
            [tmp_name] => F:\wamp\tmp\php13D3.tmp
            [error] => 0
            [size] => 488293
        )

)

下面是拆分重組數組代碼

<?php
    

    //print_r($_FILES['file']);
    $arr=$_FILES['file'];
    $files=array();
    for($i=0;$i<count($arr['name']);$i++){
        $files[$i]['name']=$arr['name'][$i];
        $files[$i]['type']=$arr['type'][$i];
        $files[$i]['tmp_name']=$arr['tmp_name'][$i];
        $files[$i]['error']=$arr['error'][$i];
        $files[$i]['size']=$arr['size'][$i];
    }

    print_r($files);
?>

 

剩下的東西就簡單了,重復單文件上傳的步驟,遍歷處理一遍該數組就行了。

代碼如下:

<?php
    

    //print_r($_FILES['file']);
    $arr=$_FILES['file'];
    $files=array();
    for($i=0;$i<count($arr['name']);$i++){//count()統計數組鍵值name長度
        $files[$i]['name']=$arr['name'][$i];
        $files[$i]['type']=$arr['type'][$i];
        $files[$i]['tmp_name']=$arr['tmp_name'][$i];
        $files[$i]['error']=$arr['error'][$i];
        $files[$i]['size']=$arr['size'][$i];
    }

    for($i=0;$i<count($files);$i++){
    //取得上傳文件信息
    $fileName=$files[$i]['name'];
    $fileType=$files[$i]['type'];
    $fileError=$files[$i]['type'];
    $fileSize=$files[$i]['size'];
    $tempName=$files[$i]['tmp_name'];//臨時文件名
    
    //定義上傳文件類型
    $typeList = array("image/jpeg","image/jpg","image/png","image/gif"); //定義允許的類型

    if($fileError>0){
            //上傳文件錯誤編號判斷
            switch ($fileError) {
                case 1:
                    $message="上傳的文件超過了php.ini 中 upload_max_filesize 選項限制的值。"; 
                    break;
                case 2:
                    $message="上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。"; 
                    break;
                case 3:
                    $message="文件只有部分被上傳。"; 
                    break;
                case 4:
                    $message="沒有文件被上傳。";
                    break;
                case 6:
                    $message="找不到臨時文件夾。"; 
                    break;
                case 7:
                    $message="文件寫入失敗"; 
                    break;
                case 8:
                    $message="由於PHP的擴展程序中斷了文件上傳";
                    break;
            }

            exit("文件上傳失敗:".$message);

        }
    if(!is_uploaded_file($tempName)){
        //判斷是否是POST上傳過來的文件
        exit("不是通過HTTP POST方式上傳上來的");
    }else{
        if(!in_array($fileType, $typeList)){
            exit("上傳的文件不是指定類型");
        }else{
            if(!getimagesize($tempName)){
                //避免用戶上傳惡意文件,如把病毒文件擴展名改為圖片格式
                exit("上傳的文件不是圖片");
            }
        }
            if($fileSize>1000000){
                //對特定表單的上傳文件限制大小
                exit("上傳文件超出限制大小");
            }else{
                //避免上傳文件的中文名亂碼
                $fileName=iconv("UTF-8", "GBK", $fileName);//把iconv抓取到的字符編碼從utf-8轉為gbk輸出
                $fileName=str_replace(".", time().".", $fileName);//在圖片名稱後加入時間戳,避免重名文件覆蓋
                if(move_uploaded_file($tempName, "uploads/".$fileName)){
                    echo "上傳文件成功!";
                }else{
                    echo "上傳文件失敗";
                }
            }

        }

    }
?>

 

效果如下:




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved