2011-10-31 15 views
17

Sto cercando di caricare qualcosa usando PHP e impostare un limite sulla dimensione totale che autorizzo a caricare. Voglio limitare le mie arrivi a 2 MB, ma per qualche motivo ogni volta che provo a verificare con un'istruzione if in questo modo:

if (($_FILES["file"]["size"] < 2097152)) 

Un file che è di grandi dimensioni (ad esempio un file 7MB) passerà attraverso l'istruzione if perché per qualsiasi ragione se stampo $ _FILES ["file"] ["size"], restituirà 0, invece del numero corretto di byte. Se provo a caricare qualcosa di più piccolo, come 342kb il $ _FILES ["file"] ["size"] restituirà la dimensione corretta.

C'è comunque un modo per ottenere $ _FILES ["file"] ["dimensione"] per contenere effettivamente la dimensione corretta del file? Altrimenti non so come risolvere questo problema.

+1

Qual è il limite dei dati caricabili nel tuo php.ini? Sei sicuro che il file che hai provato a caricare (7 MB) sia stato caricato correttamente? Penso che non sia ... – Marco

+0

Non sono sicuro al 100%, ma la dimensione massima di caricamento di un file è impostata da php.ini, il file di configurazione php. Se il file è più grande di quel limite, non verrà nemmeno caricato per cominciare, per cui si otterrebbe una dimensione del file pari a 0. –

+0

prova 'var_dump ($ _ FILES);';) e controlla la segnalazione degli errori ... –

risposta

25

Un file che interrompe per qualsiasi motivo (caricamento non è riuscito, supera i limiti, ecc ...) mostrerà la dimensione 0

Devi controllare per il caricamento SUCCESSO prima di fare qualsiasi cosa con il resto dei dati eupload th:

if(array_key_exists('file', $_FILES)){ 
    if ($_FILES['file']['error'] === UPLOAD_ERR_OK) { 
     echo 'upload was successful'; 
    } else { 
     die("Upload failed with error code " . $_FILES['file']['error']); 
    } 
} 

I codici di errore sono definiti here. Nel tuo caso, se hai hardcoded un limite di 2meg e qualcuno carica un file da 2,1 mega, allora il codice di errore sarebbe UPLOAD_ERR_INI_SIZE (alias 2), che è "supera il limite impostato nel file .ini".

+0

Buona risposta, davvero. +1 per te;) – Marco

+0

Grazie, questo è stato molto utile. – user494216

+1

Il codice di errore è 0, anche la dimensione è 0 ... come possiamo aggirare quella? – Deji

4
if($_FILES['file']['size'] && $_FILES['file']['size'] < (2<<20)) 

Provalo.

< < è operatore di spostamento bit a bit, il numero decimale 2 è "10" binario, quindi aggiungere 20 zeri.

+4

molto bello, anche se potresti aver spiegato il codice - non tutti sanno usare il binario per fare calcoli energetici –

1

Come ho supposto nel mio commento precedente, il problema è che il limite del file caricabile in php.ini è inferiore a 7 MB.
Così si potrebbe provare ad usare

if ($_FILES["file"]["size"] > 0 && $_FILES["file"]["size"] < 2097152) 

Si consideri che se si mette il limite (in php.ini) a 2 MB, che il check potrebbe essere facilmente scritto come

if ($_FILES["file"]["size"] > 0)