2009-06-03 26 views
37

Tôi thực hiện một số xác thực biểu mẫu để đảm bảo rằng tệp mà người dùng đã tải lên đúng loại. Nhưng việc tải lên là tùy chọn, vì vậy tôi muốn bỏ qua xác thực nếu anh ấy không tải lên bất kỳ thứ gì và gửi phần còn lại của biểu mẫu. Làm thế nào tôi có thể kiểm tra xem anh ta đã tải lên một cái gì đó hay không? Liệu $_FILES['myflie']['size'] <=0 có hoạt động không?Cách kiểm tra xem người dùng đã tải lên một tệp bằng PHP chưa?

Trả lời

101

Bạn có thể sử dụng is_uploaded_file():

if(!file_exists($_FILES['myfile']['tmp_name']) || !is_uploaded_file($_FILES['myfile']['tmp_name'])) { 
    echo 'No upload'; 
} 

Từ các tài liệu:

trả về true nếu tập tin được đặt tên bởi filename đã được tải lên thông qua HTTP POST. Điều này hữu ích để giúp đảm bảo rằng người dùng độc hại không cố gắng lừa tập lệnh làm việc trên các tệp khi mà tập lệnh không hoạt động - cho thể hiện,/etc/passwd.

này loại séc đặc biệt quan trọng nếu có bất kỳ cơ hội mà bất cứ điều gì thực hiện với các tập tin được tải lên có thể tiết lộ nội dung của họ cho người dùng , hoặc thậm chí để những người dùng khác trên cùng một hệ thống .

EDIT: Tôi đang sử dụng này trong lớp FileUpload của tôi, trong trường hợp nó giúp:

public function fileUploaded() 
{ 
    if(empty($_FILES)) { 
     return false;  
    } 
    $this->file = $_FILES[$this->formField]; 
    if(!file_exists($this->file['tmp_name']) || !is_uploaded_file($this->file['tmp_name'])){ 
     $this->errors['FileNotExists'] = true; 
     return false; 
    } 
    return true; 
} 
+0

Ayman, bạn cần cung cấp cho nó 'tmp_name'. Từ tài liệu: Để làm việc đúng, hàm is_uploaded_file() cần một đối số như $ _FILES ['userfile'] ['tmp_name'] – karim79

+0

@ Click Upvote - Thêm bit file_exists() vào đầu, tôi thực sự đang sử dụng vì vậy tôi biết nó hoạt động. Thôi buông đi. – karim79

+0

My bad - mảng $ _FILES, như Greg B đã chỉ ra, nên được kiểm tra bằng trống() – karim79

10

@ karim79 có câu trả lời đúng, nhưng tôi đã phải viết lại ví dụ của mình để phù hợp với mục đích của tôi. Ví dụ của anh ta giả định rằng tên của trường đã gửi được biết và có thể được mã hóa cứng. Tôi đã tiến thêm một bước và tạo một hàm sẽ cho tôi biết nếu có bất kỳ tệp nào được tải lên mà không cần phải biết tên của trường tải lên.

/** 
* Tests all upload fields to determine whether any files were submitted. 
* 
* @return boolean 
*/ 
function files_uploaded() { 

    // bail if there were no upload forms 
    if(empty($_FILES)) 
     return false; 

    // check for uploaded files 
    $files = $_FILES['files']['tmp_name']; 
    foreach($files as $field_title => $temp_name){ 
     if(!empty($temp_name) && is_uploaded_file($temp_name)){ 
      // found one! 
      return true; 
     } 
    } 
    // return false if no files were found 
    return false; 
} 
+0

mọi lần trả lại false me this if (empty ($ _ FILES)) .... – Phoenix

8

Mã này làm việc cho tôi. Tôi đang sử dụng nhiều tệp tải lên nên tôi cần kiểm tra xem có bất kỳ tải lên nào không. phần

HTML:

<input name="files[]" type="file" multiple="multiple" /> 

PHP phần:

if(isset($_FILES['files'])){ 


foreach($_FILES['files']['tmp_name'] as $key => $tmp_name){ 

     if(!empty($_FILES['files']['tmp_name'][$key])){ 

    // things you want to do 
    } 
} 
3

Tôi đã kiểm tra mã của bạn và nghĩ rằng bạn nên thử điều này:

if(!file_exists($_FILES['fileupload']['tmp_name']) || !is_uploaded_file($_FILES['fileupload']['tmp_name'])) 
    { 
     echo 'No upload'; 
    } 
    else 
     echo 'upload'; 
1

is_uploaded_file() là tuyệt vời để sử dụng, đặc biệt cho kiểm tra xem đó là tệp được tải lên hay tệp cục bộ (vì mục đích bảo mật).

Tuy nhiên, nếu bạn muốn kiểm tra xem người dùng đã tải lên tệp hay chưa, hãy sử dụng $_FILES['file']['error'] == UPLOAD_ERR_OK.

Xem hướng dẫn sử dụng PHP trên file upload error messages. Nếu bạn chỉ muốn kiểm tra không có tệp nào, hãy sử dụng UPLOAD_ERR_NO_FILE.

2
<!DOCTYPE html> 
<html> 
<body> 

<form action="#" method="post" enctype="multipart/form-data"> 
    Select image to upload: 
    <input name="my_files[]" type="file" multiple="multiple" /> 
    <input type="submit" value="Upload Image" name="submit"> 
</form> 


<?php 

if (isset($_FILES['my_files'])) 
    { 
    $myFile = $_FILES['my_files']; 
    $fileCount = count($myFile["name"]); 


     for ($i = 0; $i <$fileCount; $i++) 
     { 
      $error = $myFile["error"][$i]; 

      if ($error == '4') // error 4 is for "no file selected" 
      { 
       echo "no file selected"; 
      } 
      else 
      { 

       $name = $myFile["name"][$i]; 
       echo $name; 
       echo "<br>"; 
       $temporary_file = $myFile["tmp_name"][$i]; 
       echo $temporary_file; 
       echo "<br>"; 
       $type = $myFile["type"][$i]; 
       echo $type; 
       echo "<br>"; 
       $size = $myFile["size"][$i]; 
       echo $size; 
       echo "<br>"; 



       $target_path = "uploads/$name"; //first make a folder named "uploads" where you will upload files 


       if(move_uploaded_file($temporary_file,$target_path)) 
        { 
        echo " uploaded"; 
        echo "<br>"; 
        echo "<br>"; 
        } 
        else 
        { 
        echo "no upload "; 
        } 




       } 
     } 
} 
     ?> 


</body> 
</html> 

tham khảo http://www.techzigzag.com/how-to-check-that-user-has-upload-any-file-or-not-in-php/

Nhưng hãy tỉnh táo. Người dùng có thể tải lên bất kỳ loại tệp nào và cũng có thể hack máy chủ hoặc hệ thống của bạn bằng cách tải lên tệp độc hại hoặc tệp php.Trong tập lệnh này, cần có một số xác nhận hợp lệ. Cảm ơn bạn.

1

Bạn nên sử dụng $_FILES[$form_name]['error']. Nó trả về UPLOAD_ERR_NO_FILE nếu không có tệp nào được tải lên. Danh sách đầy đủ: PHP: Error Messages Explained

function isUploadOkay($form_name, &$error_message) { 
    if (!isset($_FILES[$form_name])) { 
     $error_message = "No file upload with name '$form_name' in form."; 
     return false; 
    } 
    $error = $_FILES[$form_name]['error']; 

    // List at: http://php.net/manual/en/features.file-upload.errors.php 
    if ($error != UPLOAD_ERR_OK) { 
     switch ($error) { 
      case UPLOAD_ERR_INI_SIZE: 
       $error_message = 'The uploaded file exceeds the upload_max_filesize directive in php.ini.'; 
       break; 

      case UPLOAD_ERR_FORM_SIZE: 
       $error_message = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.'; 
       break; 

      case UPLOAD_ERR_PARTIAL: 
       $error_message = 'The uploaded file was only partially uploaded.'; 
       break; 

      case UPLOAD_ERR_NO_FILE: 
       $error_message = 'No file was uploaded.'; 
       break; 

      case UPLOAD_ERR_NO_TMP_DIR: 
       $error_message = 'Missing a temporary folder.'; 
       break; 

      case UPLOAD_ERR_CANT_WRITE: 
       $error_message = 'Failed to write file to disk.'; 
       break; 

      case UPLOAD_ERR_EXTENSION: 
       $error_message = 'A PHP extension interrupted the upload.'; 
       break; 

      default: 
       $error_message = 'Unknown error'; 
      break; 
     } 
     return false; 
    } 

    $error_message = null; 
    return true; 
} 
Các vấn đề liên quan