2012-02-05 10 views
19

Ho un modulo di caricamento e sto verificando la dimensione del file e il tipo di file per limitare il file caricato a 2 megabyte e tipi di file .pdf, .jpg, .gif o .png. Il mio obiettivo è avere un messaggio di avviso visualizzato all'utente se viola una di queste regole.Come limitare la dimensione del file di tipo di caricamento file in PHP?

ci sono quattro scenari:

  1. formato corretto/tipo corretto (di lavoro)
  2. formato corretto/Tipo sbagliato (di lavoro)
  3. ERRATO Dimensioni/tipo corretto (non funzionante)
  4. Tipo NON CORRETTO/NON CORRETTO (non funzionante)

Con il mio codice corrente, visualizza sempre il messaggio di "tipo" errato quando la dimensione del file è maggiore di 2 megabyte (# 4), anche se il tipo di file è corretto (# 3).

Qualche idea, perché?

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

dispiace, che non era una rappresentazione accurata. l'avviso non viene chiamato se il file viene effettivamente caricato. domanda aggiornata – Michael

+0

Sei 'die()' ing o 'exit()' ing dopo il 'header()' o il tuo codice termina dopo quella istruzione if? –

+0

scusa, sto cercando di riassumere. chiama la funzione store_uploaded_file(), che esegue altre azioni sulla pagina. il codice non termina dopo il caricamento riuscito. – Michael

risposta

28

Qualcosa che il codice non tiene conto è la visualizzazione di più errori. Come hai notato sopra, è possibile per l'utente caricare un file> 2MB del tipo sbagliato, ma il tuo codice può riportare solo uno dei problemi. Provare qualcosa di simile:

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 
    } 
} 

Guardare negli Documenti per move_uploaded_file() (si chiama mossa non memorizzare) per più.

+1

Il tuo codice è molto più pulito; tuttavia, ho scoperto che il mio problema era in realtà con il limite impostato in php5.ini.Sto usando GoDaddy, che imposta il limite su 2 MB. Per tutti i file caricati più grandi di questo, il valore di ritorno di $ _FILES ['loaded_file'] ['size'] torna come "0" e il valore di ritorno di $ _FILES ['loaded_file'] ['type'] è vuoto. Ho dovuto modificare il tuo codice un po '. – Michael

+0

ciao, penso che se (conteggio ($ errori)! == 0) dovrebbe essere se (conteggio ($ errori) == 0), anche se non è un errore logico, tipo di errore di battitura, ma penso che dovrebbe essere corretto per evitare qualsiasi confusione. – Dharmang

+0

@Dharmang Sei corretto! Ho modificato l'errore di battitura. Grazie. ;) –

0

Se siete alla ricerca di un limite rigido attraverso tutte le immagini caricate sul sito, è possibile limitare questi in php.ini impostando la seguente:

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

che impostare il limite massimo di upload a 2 MB

+0

Anche se non è molto portabile su alcuni host (che non consentono la modifica di PHP.ini) o se si desidera imporre limiti di dimensioni file diversi su un altro file php. –

4

Spero che questo aiuti :-)

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 Questa utile ...

forma:

<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"; 
       } 
      } 
    } 
?> 
Problemi correlati