2012-02-05 30 views
19

Tengo un formulario de carga y estoy verificando el tamaño del archivo y el tipo de archivo para limitar el archivo cargado a 2 megabytes y a los tipos de archivo .pdf, .jpg, .gif o .png. Mi objetivo es que se muestre un mensaje de alerta al usuario si infringe una de estas reglas.¿Cómo limitar el tamaño del archivo de tipo de carga de archivos en PHP?

Hay cuatro escenarios:

  1. correcta Tamaño/tipo correcto (de trabajo)
  2. correcta Tamaño/tipo incorrecto (de trabajo)
  3. INCORRECTO Tamaño/tipo correcto (no trabajar)
  4. INCORRECTO Tamaño/INCORRECTO Tipo (no funciona)

Con mi código actual, siempre muestra el mensaje "tipo" incorrecto cuando el tamaño del archivo es mayor a 2 megabytes (n. ° 4), incluso si el tipo de archivo es correcto (n. ° 3).

¿Alguna idea de por qué?

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

    $file_size = $_FILES['uploaded_file']['size']; 
    $file_type = $_FILES['uploaded_file']['type']; 

    if (($file_size > 2097152)){  
     $message = 'File too large. File must be less than 2 megabytes.'; 
     echo '<script type="text/javascript">alert("'.$message.'");</script>'; 
    } 
    elseif ( 
     ($file_type != "application/pdf") && 
     ($file_type != "image/jpeg") && 
     ($file_type != "image/jpg") && 
     ($file_type != "image/gif") && 
     ($file_type != "image/png")  
    ){ 
     $message = 'Invalid file type. Only PDF, JPG, GIF and PNG types are accepted.'; 
     echo '<script type="text/javascript">alert("'.$message.'");</script>';   
    }  
    else { 
     store_uploaded_file($id); 
    } 

} 
+0

lo siento, que no era una representación exacta. la alerta no se invoca si el archivo se ha cargado realmente. pregunta actualizada – Michael

+0

¿Está 'die()' ing o 'exit()' ing después del 'header()' o su código termina después de esa instrucción if? –

+0

lo siento, estoy tratando de resumir. llama a la función store_uploaded_file(), que realiza otras acciones en la página. el código no termina después de la carga exitosa. – Michael

Respuesta

28

Algo que su código no explica está mostrando varios errores. Como ha indicado anteriormente, es posible que el usuario cargue un archivo> 2 MB del tipo incorrecto, pero su código solo puede informar uno de los problemas. Pruebe algo como:

if(isset($_FILES['uploaded_file'])) { 
    $errors  = array(); 
    $maxsize = 2097152; 
    $acceptable = array(
     'application/pdf', 
     'image/jpeg', 
     'image/jpg', 
     'image/gif', 
     'image/png' 
    ); 

    if(($_FILES['uploaded_file']['size'] >= $maxsize) || ($_FILES["uploaded_file"]["size"] == 0)) { 
     $errors[] = 'File too large. File must be less than 2 megabytes.'; 
    } 

    if(!in_array($_FILES['uploaded_file']['type'], $acceptable)) && (!empty($_FILES["uploaded_file"]["type"]))) { 
     $errors[] = 'Invalid file type. Only PDF, JPG, GIF and PNG types are accepted.'; 
    } 

    if(count($errors) === 0) { 
     move_uploaded_file($_FILES['uploaded_file']['tmpname'], '/store/to/location.file'); 
    } else { 
     foreach($errors as $error) { 
      echo '<script>alert("'.$error.'");</script>'; 
     } 

     die(); //Ensure no more processing is done 
    } 
} 

mirar en los documentos de move_uploaded_file() (se llama movimiento no almacenar) para más.

+1

Su código es mucho más limpio; sin embargo, descubrí que mi problema era en realidad con el límite establecido en php5.ini.Estoy usando GoDaddy, que predetermina el límite a 2 MB. Para todos los archivos cargados que son más grandes que esto, el valor de retorno de $ _FILES ['uploaded_file'] ['size'] vuelve como "0" y el valor de retorno de $ _FILES ['uploaded_file'] ['type'] es vacío. Tuve que modificar tu código un poco. – Michael

+0

hola, creo que (conteo ($ errores)! == 0) debería ser if (conteo ($ errores) == 0), aunque no es un error lógico, tipo de error tipográfico, pero creo que debería ser corregido para evitar cualquier confusión. – Dharmang

+0

@Dharmang ¡Estás en lo correcto! He editado el error tipográfico. Gracias. ;) –

0

Si usted está buscando un límite físico a través de todos los archivos subidos en el sitio, se puede limitar estos en php.ini estableciendo la siguiente:

`upload_max_filesize = 2M` ` post_max_size = 2M`

que fijará el límite máximo de carga de 2 MB

+0

Aunque esto no es muy portable en algunos hosts (que no permiten la modificación de PHP.ini) o si desea imponer límites de tamaño de archivo diferentes en otro archivo php. –

4

espero que esto ayude :-)

if(isset($_POST['submit'])){ 
    ini_set("post_max_size", "30M"); 
    ini_set("upload_max_filesize", "30M"); 
    ini_set("memory_limit", "20000M"); 
    $fileName='product_demo.png'; 

    if($_FILES['imgproduct']['size'] > 0 && 
      (($_FILES["imgproduct"]["type"] == "image/gif") || 
       ($_FILES["imgproduct"]["type"] == "image/jpeg")|| 
       ($_FILES["imgproduct"]["type"] == "image/pjpeg") || 
       ($_FILES["imgproduct"]["type"] == "image/png") && 
       ($_FILES["imgproduct"]["size"] < 2097152))){ 

     if ($_FILES["imgproduct"]["error"] > 0){ 
      echo "Return Code: " . $_FILES["imgproduct"]["error"] . "<br />"; 
     } else {  
      $rnd=rand(100,999); 
      $rnd=$rnd."_"; 
      $fileName = $rnd.trim($_FILES['imgproduct']['name']); 
      $tmpName = $_FILES['imgproduct']['tmp_name']; 
      $fileSize = $_FILES['imgproduct']['size']; 
      $fileType = $_FILES['imgproduct']['type']; 
      $target = "upload/"; 
      echo $target = $target .$rnd. basename($_FILES['imgproduct']['name']) ; 
      move_uploaded_file($_FILES['imgproduct']['tmp_name'], $target); 
     } 
    } else { 
     echo "Sorry, there was a problem uploading your file."; 
    } 
} 
0
var sizef = document.getElementById('input-file-id').files[0].size; 
       if(sizef > 210000){ 
        alert('sorry error'); 
       }else { 
        //action 
       } 
0

Hope Esta utilidad ...

formulario:

<form action="check.php" method="post" enctype="multipart/form-data"> 
<label>Upload An Image</label> 
<input type="file" name="file_upload" /> 
<input type="submit" name="upload"/> 
</form> 

check.php:

<?php 
    if(isset($_POST['upload'])){ 
     $maxsize=2097152; 
     $format=array('image/jpeg'); 
    if($_FILES['file_upload']['size']>=$maxsize){ 
     $error_1='File Size too large'; 
     echo '<script>alert("'.$error_1.'")</script>'; 
    } 
    elseif($_FILES['file_upload']['size']==0){ 
     $error_2='Invalid File'; 
     echo '<script>alert("'.$error_2.'")</script>'; 
    } 
    elseif(!in_array($_FILES['file_upload']['type'],$format)){ 
     $error_3='Format Not Supported.Only .jpeg files are accepted'; 
     echo '<script>alert("'.$error_3.'")</script>'; 
     } 

     else{ 
      $target_dir = "uploads/"; 
      $target_file = $target_dir . basename($_FILES["file_upload"]["name"]); 
      if(move_uploaded_file($_FILES["file_upload"]["tmp_name"], $target_file)){ 
      echo "The file ". basename($_FILES["file_upload"]["name"]). " has been uploaded."; 
      } 
      else{ 
       echo "sorry"; 
       } 
      } 
    } 
?> 
Cuestiones relacionadas