2012-09-21 16 views
19

Sto lavorando al caricamento di file tramite una pagina Web con una barra di avanzamento utilizzando Valums file uploader. Quasi tutto funziona correttamente, ma non sono in grado di modificare la directory tmp predefinita, in cui il file viene archiviato durante il caricamento.Impostazione PHP tmp dir - Caricamento PHP non funzionante

I file devono essere conservati in /upload directory e non nel sistema di default /tmp directory, perché /tmp è montato in un disco RAM che ha la sua dimensione limitata a 4 MB e   utente sarà il caricamento di file di circa 10 MB  .

Ho cercato molte pagine Web, ma nessuna delle soluzioni ha funzionato. Ho impostato directory temp nella php.ini:

upload_tmp_dir =/upload 

Ho impostato le autorizzazioni al /upload dir e apache è proprietario del file, in modo che la directory è sicuramente scrivibile da PHP.

Ho impostato il percorso di destinazione nel file uploader su /upload, perché voglio che i file vengano memorizzati dopo il caricamento anche in questa directory. Il risultato finale è che i file di piccole dimensioni vengono caricati con successo, ma i file più grandi di 4   non riescono a caricare, l'unico motivo di questo comportamento che mi viene in mente è che i file sono memorizzati in /tmp durante il caricamento. Per sicurezza, l'ho controllato con sys_get_temp_dir() e il risultato è stato /tmp -so PHP ignora la mia direttiva php.ini o c'è un altro modo per impostare dove i file vengono memorizzati durante il caricamento.

Oh, e l'ultima informazione: open_basedir non è impostata, quindi l'accesso PHP al disco è limitato solo dai permessi dei file.

+2

avere riavviato il server di (scusate per questa stupida domanda)? – soju

+0

Non ci sono domande stupide, solo risposte stupide :). Sì, l'ho fatto molte volte mentre cercavo di risolvere il problema e provare diverse soluzioni. – Wookie88

+0

Hai controllato che php non sia installato come cgi mod? (Da doc: * Se la directory specificata qui non è scrivibile, PHP torna alla directory temporanea predefinita di sistema *) – soju

risposta

50

Il problema descritto qui è stato risolto molto tempo fa ma non ricordo veramente quale fosse la ragione principale per cui i caricamenti non funzionavano. C'erano molte cose che dovevano essere sistemate in modo che il caricamento potesse funzionare. Ho creato una lista di controllo che potrebbe aiutare gli altri ad avere problemi simili e la modificherò per renderla il più utile possibile. Come ho detto prima in chat, stavo lavorando su un sistema embedded, quindi alcuni punti potrebbero essere saltati su sistemi non incorporati.

  • Verificare upload_tmp_dir in php.ini. Questa è la directory in cui PHP memorizza i file temporanei durante il caricamento.

  • Controllare open_basedir in php.ini. Se definito, limita i diritti di lettura/scrittura PHP al percorso specificato e alle sue sottodirectory. Assicurarsi che upload_tmp_dir si trovi in ​​questo percorso.

  • Controllare post_max_size in php.ini. Se vuoi caricare 20 file Mbyte, prova qualcosa di un po 'più grande, come post_max_size = 21M. Questo definisce la dimensione più grande del messaggio POST che probabilmente stai usando durante il caricamento.

  • Controllare upload_max_filesize in php.ini. Questo specifica il più grande file che può essere caricato.

  • Verificare memory_limit in php.ini. Questa è la quantità massima di memoria che uno script può consumare. È abbastanza ovvio che non può essere inferiore alla dimensione del caricamento (per essere onesti non ne sono abbastanza sicuro, PHP probabilmente sta eseguendo il buffering durante la copia di file temporanei).

  • Assicurarsi di controllare il file php.ini corretto utilizzato da PHP sul server web.La soluzione migliore è quella di eseguire lo script alla direttiva qui descritto http://php.net/manual/en/function.php-ini-loaded-file.php (php_ini_loaded_file funzione)

  • controllare quale utente php viene eseguito come (Vedi qui come fare: How to check what user php is running as?). Ho lavorato su diverse distribuzioni e server. A volte è apache, ma a volte può essere root. Ad ogni modo, controlla che questo utente abbia i diritti per leggere e scrivere nella directory temporanea e nella directory in cui stai caricando. Controllare tutte le directory nel percorso nel caso in cui da caricare in sottodirectory (ad esempio /dir1/dir2/ -check sia dir1 e dir2.

  • su piattaforme embedded a volte è necessario limitare l'iscritto al filesystem di root, perché si trova nella scheda flash e questo aiuta ad estendere la vita di questa carta.Se stai usando gli script per abilitare/disabilitare le scritture di file, assicurati di abilitare la scrittura prima di caricare

  • Ho avuto seri problemi con PHP> 5.4 monitoraggio del caricamento in base alle sessioni (come descritto qui http://phpmaster.com/tracking-upload-progress-with-php-and-javascript/) su alcune piattaforme. Provate qualcosa di semplice all'inizio (come qui: http://www.dzone.com/snippets/very-simple-php-file-upload). Se funziona, potete provare un mech più sofisticato mec-.

  • Se si apportano modifiche in php.ini, ricordare di riavviare il server in modo che la configurazione venga ricaricata.

+0

Bella lista di controllo - grazie! – Olaf

+0

'memory_limit' non è un problema per i caricamenti. Vedi http://stackoverflow.com/a/5828654/956397 – PiTheNumber

+0

Se non hai intenzione di leggere l'intero file in PHP, hai ragione. Tuttavia, è bene mantenere questo punto nella lista di controllo per mantenerlo più universale. – Wookie88

1

Ho lottato con questo problema per molto tempo ... La mia soluzione era quella di modificare il file php.ini, nella cartella che conteneva lo script php. Questo era importante, in quanto la modifica del php.ini alla radice non risolveva il problema (ho un php.ini in ogni cartella per il controllo granulare). Le voci importanti nel mio php.ini sembravano questo .... (l'output_buffering non è probabilmente necessaria per questo problema)

output_buffering = On 
upload_max_filesize = 20M 
post_max_size = 21M 
Problemi correlati