PHP 多文件上傳的三種方法

這裏介紹三種多文件上傳的方法,前兩種都是直接遍歷三維超全局數組$_FILES,最後一種是先定義一個單文件上傳函數,再循環調用該函數,完成多文件的上傳。php

1.當多文件上傳表單中多個上傳文件的name屬性爲「pic[]」形式時, 
  也即表單爲這種形式: 
<!--lang: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> 


可用foreach 循環 上傳多個文件: 



//1.獲取要上傳文件的信息 
$up_info=$_FILES['pic']; 

$ob_path="../system";   

$typelist=array("image/gif","image/jpeg","image/pjpeg","image/png"); //定義運行的上傳文件類型 


for($i=0;$i<count($up_info['name']);$i++){        //foreach 循環處理多個文件上傳 
//2.判斷文件是否上傳錯誤 

if($up_info['error'][$i]>0){ 
    switch($up_info['error'][$i]){ 
        case 1: 
            $err_info="上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值"; 
            break; 
        case 2: 
            $err_info="上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值"; 
            break; 
        case 3: 
            $err_info="文件只有部分被上傳"; 
            break; 
        case 4: 
            $err_info="沒有文件被上傳"; 
            break; 
        case 6: 
            $err_info="找不到臨時文件夾"; 
            break; 
        case 7: 
            $err_info="文件寫入失敗"; 
            break; 
        default: 
            $err_info="未知的上傳錯誤"; 
            break; 
    } 
    continue($err_info); 
} 


//3.判斷文件上傳的類型是否合法 

if(!in_array($up_info['type'][$i],$typelist)){ 
    continue('文件類型錯誤!'.$up_info['type'][$i]); 
} 

//4.上傳文件的大小過濾 

if($up_info['size'][$i]>1000000){ 
    continue('文件大小超過1000000'); 
} 


//5.上傳文件名處理 

$exten_name=pathinfo($up_info['name'][$i],PATHINFO_EXTENSION); 

    do{ 
        $main_name=date('YmHis'.'--'.rand(100,999));         
        $new_name=$main_name.'.'.$exten_name; 
    }while(file_exists($to_path.'/'.$new_name)); 



//6.判斷是不是上傳的文件,並執行上傳 

if(is_uploaded_file($up_info['tmp_name'][$i])){ 

        if(move_uploaded_file($up_info['tmp_name'][$i],$ob_path.'/'.$new_name)){ 
            echo '文件上傳成功!'; 
            }else{ 
            echo '上傳文件移動失敗!'; 
            } 
    }else{ 
        echo '文件不是上傳的文件'; 
        } 

}   //for循環的括號 



2.當多文件上傳表單中多個上傳文件的name屬性爲「pic,text,doc,pdf」形式時, 
  也即表單爲這種形式: 

<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="text" /><br><br> 
    <input type="file" name="doc" /><br><br> 
    <input type="file" name="pdf" /><br><br> 

    <input type="submit" value="upload"/> 

</form> 




也可用foreach 循環 上傳多個文件: 

//1.獲取要上傳文件的信息 
$up_info=$_FILES; 

$ob_path="..\system";   

$typelist=array("image/gif","image/jpeg","image/pjpeg","image/png"); //定義運行的上傳文件類型 



foreach($up_info as $k_name=>$value){   //用foreach循環 處理多個文件的上傳 
//2.判斷文件是否上傳錯誤 

if($up_info[$k_name]['error']>0){ 
    switch($up_info['error'][$i]){ 
        case 1: 
            $err_info="上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值"; 
            break; 
        case 2: 
            $err_info="上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值"; 
            break; 
        case 3: 
            $err_info="文件只有部分被上傳"; 
            break; 
        case 4: 
            $err_info="沒有文件被上傳"; 
            break; 
        case 6: 
            $err_info="找不到臨時文件夾"; 
            break; 
        case 7: 
            $err_info="文件寫入失敗"; 
            break; 
        default: 
            $err_info="未知的上傳錯誤"; 
            break; 
    } 
    continue($err_info); 
} 


//3.判斷文件上傳的類型是否合法 

if(!in_array($up_info[$k_name]['type'],$typelist)){ 
    continue('文件類型錯誤!'.$up_info[$k_name]['type']); 
} 

//4.上傳文件的大小過濾 

if($up_info[$k_name]['size']>100000){ 
    echo '文件大小超過**'; 
    continue; 
} 


//5.上傳文件名處理 

$exten_name=pathinfo($up_info[$k_name]['name'],PATHINFO_EXTENSION); 

    do{ 
        $main_name=date('YmHis'.'--'.rand(100,999));         
        $new_name=$main_name.'.'.$exten_name; 
    }while(file_exists($to_path.'/'.$new_name)); 


//6.判斷是不是上傳的文件,並執行上傳 

if(is_uploaded_file($up_info[$k_name]['tmp_name'])){ 

        if(move_uploaded_file($up_info[$k_name]['tmp_name'],$ob_path.'/'.$new_name)){ 
            echo '文件上傳成功!'; 
            }else{ 
            echo '上傳文件移動失敗!'; 
            } 
    }else{ 
        echo '文件不是上傳的文件'; 
        } 

}   //for循環的括號 



//3.上面的循環是嵌入到文件上傳的代碼中的,可能有點很差理解,這兒提供第三種法, 
//先定義單個文件上傳的函數,再循環調用這個函數,每次傳入一個文件的上傳信息, 
//也能夠到達多文件上傳的目的,並且這種方式,更容易理解。 

//上傳的表單的形式和第二種方法中的相同,即: 


    <form action="" method="post" enctype="multipart/form-data"> 
        <input type="hidden" name="MAX_FILE_SIZE" value=""> 
        <input type="file" name="pic1" ><br>             
        <input type="file" name="pic2"><br> 
        <input type="file" name="pic3"><br> 
        <input type="submit" value="upload"> 
    </form> 

//定義函數以下: 

/* 
 *單文件上傳函數 
 *@param array $up_info   記錄上傳文件信息的超全局數組 
 *@param string $to_path  上傳文件的目標路徑 
 *@param array $typlist   容許的文件類型 
 *@param int    $file_size容許的文件大小 
 *@return string 上傳失敗,返回失敗的緣由, 
 * 
 *                成功返回包括文件名的路徑。 
 */


function upload_fun($up_info,$to_path,$typelist=array(),$file_size=2000000){ 

    //1.判斷文件上傳是否錯誤 

    if($up_file['error']>0){ 
        switch($up_info['error']){ 
            case 1: 
                $err_info="上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值"; 
                break; 
            case 2: 
                $err_info="上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值"; 
                break; 
            case 3: 
                $err_info="文件只有部分被上傳"; 
                break; 
            case 4: 
                $err_info="沒有文件被上傳"; 
                break; 
            case 6: 
                $err_info="找不到臨時文件夾"; 
                break; 
            case 7: 
                $err_info="文件寫入失敗"; 
                break; 
            default: 
                $err_info="未知的上傳錯誤"; 
                break; 
        } 

        return $err_info; 
        die(); 
    } 


    //2.判斷上傳文件類型是否合法 

    if(count($typelist)>0){ 
        if(!in_array($up_info['type'],$typelist)){ 

            $err_info='文件類型不合法!'.$up_info['type']; 
            return $err_info; 
            die(); 
        } 
    } 

    //4.判斷上傳文件大小是否超出容許值 

    if($up_info['size']>$file_size){ 

        return $err_info='文件大小超過'.$file_size; 
        die(); 
} 

    //5.上傳文件重命名 

    $exten_name=pathinfo($up_info['name'],PATHINFO_EXTENSION); 

    do{ 
        $main_name=date('YmHis'.'--'.rand(100,999));         
        $new_name=$main_name.'.'.$exten_name; 
    }while(file_exists($to_path.'/'.$new_name)); 



    //6.判斷是不是上傳的文件,並移動文件 

    if(is_uploaded_file($up_info['tmp_name'])){ 

        if(move_uploaded_file($up_info['tmp_name'],$to_path.'/'.$new_name)){ 

                $err_info=$to_path.'/'.$new_name; 
            return     $err_info;             
            die(); 
            }else{ 

            return $err_info='上傳文件移動失敗!'; 
            die(); 

                } 
    }else{ 

            return $err_info='這個文件不是上傳文件!'; 
            die(); 
    } 

} 


//函數使用方法以下 

$multi_info=$_FILES;  //接收$_FILES的所有上傳信息 

$to_path='system';      //上傳文件的目標路徑     

foreach($multi_info as $name=>$up_info){      //foreach 遍歷$multi_info  

    $err_info=upload_fun($up_info,$to_path);  //調用單文件上傳函數 

    p($err_info);                              //輸出返回信息; 

} 



//本文到此結束,歡迎指正,謝謝閱覽。
相關文章
相關標籤/搜索