2012-01-05 141 views
1

我寫了下面的php函數來上傳文件,但我很難與允許的文件類型的數組。如果我只分配一個文件類型,即image/png,它可以正常工作。如果我分配了多個,它不工作。我使用in_array()函數來確定允許的文件類型,但我無法弄清楚如何正確使用它。PHP文件類型驗證

謝謝!

function mcSingleFileUpload($mcUpFileName, $mcAllowedFileTypes, $mcFileSizeMax){ 
    if(!empty($mcUpFileName)){ 

     $mcIsValidUpload = true; 

     // upload directory 
     $mcUploadDir = UPLOAD_DIRECTORY; 

     // current file properties 
     $mcFileName = $_FILES[$mcUpFileName]['name']; 
     $mcFileType = $_FILES[$mcUpFileName]['type']; 
     $mcFileSize = $_FILES[$mcUpFileName]['size']; 
     $mcTempFileName = $_FILES[$mcUpFileName]['tmp_name']; 
     $mcFileError = $_FILES[$mcUpFileName]['error']; 

     // file size limit 
     $mcFileSizeLimit = $mcFileSizeMax; 

     // convert bytes to kilobytes 
     $mcBytesInKb = 1024; 
     $mcFileSizeKb = round($mcFileSize/$mcBytesInKb, 2); 

     // create array for allowed file types 
     $mcAllowedFTypes = array($mcAllowedFileTypes); 

     // create unique file name 
     $mcUniqueFileName = date('m-d-Y').'-'.time().'-'.$mcFileName; 

     // if file error 
     if($mcFileError > 0) 
     { 
      $mcIsValidUpload = false; 
      mcResponseMessage(true, 'File error!'); 
     } 

     // if no file error 
     if($mcFileError == 0) 
     { 
      // check file type 
      if(!in_array($mcFileType, $mcAllowedFTypes)){ 
       $mcIsValidUpload = false; 
       mcResponseMessage(true, 'Invalid file type!'); 
      } 

      // check file size 
      if($mcFileSize > $mcFileSizeLimit){ 
       $mcIsValidUpload = false; 
       mcResponseMessage(true, 'File exceeds maximum limit of '.$mcFileSizeKb.'kB'); 
      } 

      // move uploaded file to assigned directory 
      if($mcIsValidUpload == true){ 
       if(move_uploaded_file($mcTempFileName, $mcUploadDir.$mcUniqueFileName)){ 
        mcResponseMessage(false, 'File uploaded successfully!'); 
       } 
       else{ 
        mcResponseMessage(true, 'File could not be uploaded!'); 
       } 
      } 
     } 
    } 
} 
//mcRequiredFile('mcFileUpSingle','please select a file to upload!'); 
mcSingleFileUpload('mcFileUpSingle', 'image/png,image/jpg', 2097152); 
+0

,因爲文件類型和大小容易被客戶端欺騙。您將改爲獲取文件大小並使用tmp_file鍵入自己的內容。你也想驗證文件擴展名。基本上用上面的代碼,我可以很容易地上傳一個文件,讓我接管你的大部分服務器。 – dqhendricks 2012-01-05 23:19:47

回答

0

改變這一行:

$mcAllowedFTypes = array($mcAllowedFileTypes); 

要這樣:

$mcAllowedFTypes = explode(',',$mcAllowedFileTypes); 
你不希望使用$ _FILE內容超級全球進行驗證
+0

謝謝!有用。 – user1002039 2012-01-05 23:07:35

+0

不用擔心。僅供參考,要使用您使用的方法,您需要將整行換行引號和eval()函數。 – SmokeyPHP 2012-01-05 23:09:37