2009-06-03 18 views
37

Realizo alguna validación de formulario para garantizar que el archivo que cargó un usuario sea del tipo correcto. Pero la carga es opcional, por lo que quiero omitir la validación si no subió nada y envié el resto del formulario. ¿Cómo puedo verificar si subió algo o no? ¿Funcionará $_FILES['myflie']['size'] <=0?¿Cómo comprobar si el usuario ha subido un archivo en PHP?

Respuesta

101

Puede utilizar is_uploaded_file():

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

A partir de los documentos:

Devuelve TRUE si el fichero nombrado por nombre del archivo fue cargado a través de HTTP POST. Esto es útil para ayudar a garantizar que un usuario malintencionado no haya intentado engañar la secuencia de comandos para que trabaje en archivos al que no debería funcionar, para la instancia ,/etc/passwd.

Este tipo de comprobación es especialmente importante si hay alguna posibilidad de que nada hacer con los archivos cargados podría revelar su contenido al usuario , o incluso a otros usuarios en el mismo sistema .

EDIT: Estoy usando esto en mi clase FileUpload, en caso de que ayuda:

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, necesitas darle el 'tmp_name'. Del doc: Para un correcto funcionamiento, la función is_uploaded_file() necesita un argumento como $ _FILES ['userfile'] ['tmp_name'] – karim79

+0

@ Click Upvote - Agregó el bit file_exists() al comienzo, en realidad estoy usando eso, entonces sé que funciona. Darle una oportunidad. – karim79

+0

Mi mal - la matriz $ _FILES, como señaló Greg B, debería verificarse con empty() – karim79

10

@ karim79 tiene la respuesta correcta, pero tenía que volver a escribir su ejemplo para que se adapte a mis propósitos. Su ejemplo supone que el nombre del campo enviado es conocido y puede codificarse de manera rígida. Lo llevé un paso más allá e hice una función que me indicará si se cargaron algunos archivos sin tener que saber el nombre del campo de carga.

/** 
* 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

everytime return false me this if (empty ($ _ FILES)) .... – Phoenix

8

Este código funcionó para mí. Estoy usando varias cargas de archivos, así que necesitaba verificar si ha habido alguna carga. parte

HTML:

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

parte PHP:

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

revisar su código y creo que deberías probar este:

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

is_uploaded_file() es de gran uso, especialmente para comprobando si es un archivo cargado o un archivo local (por razones de seguridad).

Sin embargo, si desea comprobar si el usuario ha cargado un archivo, utilice $_FILES['file']['error'] == UPLOAD_ERR_OK.

Consulte el manual de PHP en file upload error messages. Si solo quiere comprobar que no hay ningún archivo, use 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> 

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

Pero estar alerta. El usuario puede cargar cualquier tipo de archivo y también puede piratear su servidor o sistema cargando un archivo malicioso o php.En este script, debe haber algunas validaciones. Gracias.

1

Debe usar $_FILES[$form_name]['error']. Devuelve UPLOAD_ERR_NO_FILE si no se cargó ningún archivo. Lista completa: 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; 
} 
Cuestiones relacionadas