2016-06-23 37 views
2

我目前使用這個PHP代碼上傳功能。我需要知道如何爲1)擴展添加一些文件類型驗證,2)文件大小限制,以及3)檢查是否確實選擇了要上載的文件。PHP上傳文件類型,大小和存在?

感謝您的任何幫助。

<?php 
if(isset($_POST['submit'])){ 
    if(count($_FILES['upload']['name']) > 0){ 
     //Loop through each file 
     for($i=0; $i<count($_FILES['upload']['name']); $i++) { 
      //Get the temp file path 
      $tmpFilePath = $_FILES['upload']['tmp_name'][$i]; 

      //Make sure we have a filepath 
      if($tmpFilePath != "tmp/"){ 

       //save the filename 
       $shortname = $_FILES['upload']['name'][$i]; 

       //save the url and the file 
       $filePath = "uploads/" . date('d-m-Y-H-i-s').'-'.$_FILES['upload']['name'][$i]; 

       //Upload the file into the temp dir 
       if(move_uploaded_file($tmpFilePath, $filePath)) { 

        $files[] = $shortname; 
        //insert into db 
        //use $shortname for the filename 
        //use $filePath for the relative url to the file 

       } 
       } 
     } 
    } 

      header('Location: http://localhost/FloodMap/report.html'); 
      exit; 
} 
?> 
+2

你可以檢查這個獲得擴展http://stackoverflow.com/questions/10368217/how-to-get-the-file-extension-in-php 一邊你只是puth $ _FILES ['upload '] ['size'] – vibol

+0

看到這個鏈接,你會得到你所有的答案:http://www.w3schools.com/php/php_file_upload.asp – Avishake

回答

1

要檢查的文件擴展名

$tmpFilePath = $_FILES['upload']['tmp_name'][$i]; 

    $imageFileType = pathinfo($tmpFilePath,PATHINFO_EXTENSION); 

    if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" 
    && $imageFileType != "gif") { 
     echo "Only JPG, JPEG, PNG & GIF files are allowed."; 
    } 

查看文件大小

if ($_FILES["upload"]["size"][$i] > 500000) { 
    echo "Sorry, your file is too large."; 
} 

要檢查是收到文件

if($_FILES['upload']['tmp_name'][$i]!=""){ 


} 
1
  • 檢查該文件已成功上傳

According to the manual PHP返回$_FILES數組中的錯誤代碼。因此,例如...

if ($_FILES['upload']['error'] == UPLOAD_ERR_OK) { 
    /* the file was uploaded successfully */ 
} 
  • 檢查的文件擴展名

雖然$_FILES陣列確實提供了一個擴展的是要記住,這是客戶端提供的數據,因此是非常重要的它不可信任。事實上,你可以信任的數組中唯一的東西是PHP提供的錯誤和tmp_name。其他一切都來自客戶端。

因此,要驗證一個文件是你希望有些什麼,你就必須檢查文件對這樣神奇的東西MIME字節像finfo_file

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$mimeType = finfo_file($finfo, $_FILES['upload']['tmp_name']); 

$allowedMimes = ['image/jpg','image/gif','image/png']; 

if (!in_array($mimeType, $allowedMimes, true)) { 
    throw new FileException("File not allowed..."); 
} 
  • 檢查文件大小

再次,如前所述,$_FILES數組提供了上傳的大小關鍵字,即客戶端提供的數據,不應該被信任。相反,只需檢查filesize($_FILES['upload']['tmp_name'])。這樣你就可以檢查文件的實際大小。


獎金

FWIW,檢查在服務器級別的文件大小(如果唯一目的是要告訴這個文件太大用戶),使一個相當可怕的用戶體驗。最好先在客戶端做這樣的事情,這樣他們纔會知道,如果它太大,甚至會打擾上傳文件。

在HTML5中,我們可以用File API來做到這一點。在您的表單中,只需附加一些事件偵聽器,如onchange或其他東西,並檢查File.files[0].size以提醒用戶。你也可以爲文件類型做同樣的事情。

當然,如果您需要用於其他目的,我並不建議您檢查服務器端的文件大小限制。只是說,如果它是唯一的告訴用戶的手段,他們上傳的文件太大了,它會削弱用戶體驗。