Nessun errore durante il caricamento di un file molto grande in PHP?
Domanda
Ho un modulo PHP per il caricamento dei file e funziona benissimo e visualizza un messaggio di errore se qualcosa è andato storto. Va tutto bene.
Il problema è quando provo con un file molto grande, aggiorna semplicemente la pagina come se non avessi inviato alcun file e nessuna delle variabili $ _POST dal modulo viene persino inviata al server.
Voglio mostrare un errore all'utente, facendo loro sapere che il file è troppo grande. Tuttavia, non posso farlo.
Qualcuno sa cosa sta succedendo?
Soluzione
Controlla il tuo file ini PHP, che regola la dimensione di un file che PHP consentirà di essere caricato. Queste variabili sono importanti:
- dimensione massima caricamento file (upload_max_filesize)
- dimensione massima dei dati post (post_max_size)
- limite di memoria (memory_limit)
Eventuali caricamenti al di fuori di questi limiti verranno ignorati o eliminati, a seconda delle impostazioni.
Questa sezione della documentazione contiene il miglior riepilogo: http://ca3.php.net/manual/en/features.file-upload.common-pitfalls.php
MODIFICA: nota inoltre che la maggior parte dei browser non invierà caricamenti di dimensioni superiori a 2 GB. Questo link è obsoleto, ma dà un'idea: http://www.motobit.com/help /scptutl/pa98.htm . Qualcuno ha una migliore fonte di informazioni su questo?
Esistono anche limiti che possono essere imposti dal server, come Apache: http://httpd.apache.org/docs/2.2/mod/core.html#limitrequestbody
Per vedere veramente cosa sta succedendo, dovresti probabilmente controllare i log del tuo server web, controllare il limite di upload del browser (se stai usando Firefox) e provare a vedere se print_r($_FILES)
genera numeri di errore utili. Se tutto il resto fallisce, prova il monitor del traffico di rete in firebug. La chiave è determinare se la richiesta sta persino andando al server e se è come appare la richiesta (comprese le intestazioni). Una volta arrivato così lontano nella catena, puoi tornare indietro e vedere come PHP gestisce il caricamento.
Altri suggerimenti
Il tuo $ _POST è probabilmente vuoto perché il caricamento ha superato la direttiva post_max_size :
Dalla pagina delle direttive di PHP :
Se la dimensione dei dati post è maggiore di post_max_size, $ _POST e i superglobali $ _FILES sono vuoti . Questo può essere monitorato in vari modi, per esempio. passando la variabile $ _GET a lo script che elabora i dati, ad es.
<form action="edit.php?processed=1">
e quindi verifica se $ _GET ['elaborato'] è impostato.
non puoi conoscere la dimensione del file che viene caricato, fino a quando non viene caricato completamente. quindi se si desidera determinare la dimensione del file e quindi mostrare un errore per file di grandi dimensioni, è necessario prima caricare il file, quindi verificare la dimensione del file. per avere un file di grandi dimensioni caricato, dovresti impostare 2 impostazioni nel tuo file di configurazione php, php.ini. aprilo e cerca " upload_max_filesize " e imposta il valore sul valore massimo desiderato. quindi è necessario impostare il valore massimo per i parametri POST, poiché i file caricati vengono ricevuti tramite il metodo POST HTTP. trova " post_max_size " e impostalo su un valore elevato su.
Vorrei implementare un semplice script che fa regolari chiamate Ajax per sapere quanto del caricamento è stato fatto. È quindi possibile implementare una sorta di barra di avanzamento. Ci sono un paio di esempi in rete:
http://martinjansen.com/ 2007/04/28 / di caricamento file-progress-bar-con-php /
dimensione massima caricamento file (upload_max_filesize) dimensione massima dei dati post (post_max_size) sono le direttive che devi impostare. L'ho testato con più sistemi operativi, browser ecc. E queste sono le uniche due cose di cui devi preoccuparti.
a parte le opzioni come hanno risposto gli ex utenti:
max upload filesize (upload_max_filesize)
max post data size (post_max_size)
memory limit (memory_limit)
ce n'è anche uno, quando il file è molto grande, o la linea è occupata, ci vuole molto tempo per eseguire questa operazione, che colpirà al limite del limite di esecuzione dello script.
max_execution_time