2012-11-26 17 views
14

Questo problema sembra direttamente correlato al famigerato limite di 2 GB e non sono sicuro di questo problema se si tratta di un problema PHP a 32 bit. Ho visto i commenti relativi a HTTP non progettati per file così grandi. Tuttavia, preferirei estrapolare questa direzione prima di decidere in merito a qualsiasi cambiamento fondamentale a ciò che è stato dimostrato funzionare fino ad ora. Come suggerisce il titolo, ho bisogno di caricare> 2 GB di file, il più grande finora 3,8 GB. Ho un modulo creato utilizzando jQuery-file-upload che non ha avuto problemi nell'invio di file (tutti meno < 2GB) fino a quando non sono stati avviati questi file di grandi dimensioni. L'intervallo di 3,8 GB richiede forse 5 minuti per il caricamento da Caricamento file e la barra di avanzamento viene completata al 100%. Tuttavia, l'errore segnalato dopo il caricamento è un tipo 1 che suggerisce che il limite di dimensioni del file è stato violato.Caricamenti di file HTTP da 4 GB utilizzando jQuery-File-Upload, Apache e PHP

Se si monitora l'utilizzo del disco sul server durante il caricamento, avrà le seguenti proprietà di esempio: Prima di caricare il disco viene utilizzato il 30%, poiché il caricamento continua a incrementare questo utilizzo, 31%, 32% .... 45%, 46%, ecc. Tuttavia attorno al punto da 2 GB l'utilizzo del disco scende al 30% mentre il caricamento file client/browser continua. Quando l'utilizzo del disco del server smette di aumentare, il client può essere solo al 60% del caricamento. Tuttavia, il client continua a raggiungere il 100% ma non viene accettato dal server poiché lo stato del disco non si sposta mai del 30%.

Io corro Ubuntu a 64bit (ultima) con Apache/2.2.22 (Ubuntu) e PHP versione 5.3.10-1ubuntu3.2 Dopo molti giorni e disattivare la ricerca di una soluzione che ancora non può ottenere il 3.8GB file da caricare dopo aver modificato così tante impostazioni. Elencherò il tipo di modifiche di seguito ma a questo punto penso che potrebbe trattarsi di un problema PHP a 32 bit, quindi se qualcuno può suggerire un link che valga la pena di seguirlo o una soluzione che valga la pena provarlo, lo apprezzerei.

In Apache2 Ho impostato il seguente:

- apache2.conf I've set Timeout to 900 
- httpd.conf I've set LimitRequestBody to 0 
- .htaccess in the file upload directory I've set: 
    - LimitRequestBody to 4939212390 
    - php_value upload_max_filesize 4831838208 
    - php_value post_max_size 4939212390 

In php.ini ho impostato il seguente:

- UPLOAD_MAX_FILESIZE 4831838208 
- POST_MAX_SIZE 4939212390 
- max_execution_time 120 
- max_input_time 60 
- memory_limit 128M 

Se eseguo il seguente sul server sembrerebbe la PHP non ha un problema a 32 bit, ma non ne sono sicuro in questa fase.

php -r "echo PHP_INT_MAX;" 
9223372036854775807 

Come ho già detto qualsiasi idea sarebbe molto apprezzata.

UPDATE:

hanno risolto questo problema, quindi grazie a @BogdanBurim per suggerire la parte posteriore per approccio basi:

sono riuscito a caricare un file di 3,8 GB su HTTP con le seguenti impostazioni:

In Apache2 ho impostato il seguente:

- apache2.conf I've set Timeout to 900 
- httpd.conf I've set LimitRequestBody to 0 
- .htaccess in the file upload directory I've set: 
    - LimitRequestBody to 0 
    - php_value upload_max_filesize 0 
    - php_value post_max_size 4939212390 
- .htaccess in the php temp directory (in my case its /tmp/) I've set: 
    - LimitRequestBody to 0 
    - php_value upload_max_filesize 0 
    - php_value post_max_size 4939212390 

in PHP.ini Ho impostato il seguente:

- UPLOAD_MAX_FILESIZE 0 
- POST_MAX_SIZE 4939212390 
- max_execution_time 120 
- max_input_time 60 
- memory_limit 128M 

L'unica altra parte importante di questa soluzione è stato dover rimuovere il MAX_FILE_SIZE, HTML dal modulo di upload:

<input type="hidden" name="MAX_FILE_SIZE" value="4939212390" /> 

Avere questo set continuamente provocato un PHP errore di tipo 2, quindi php non può gestire il numero intero maggiore di 32 bit impostato. La rimozione ha causato errori di tipo 1 di PHP fino a quando ho cambiato UPLOAD_MAX_FILESIZE a 0 ovunque e hey presto ora funziona !!!!

http://php.net/manual/en/features.file-upload.errors.php

+0

correlato: http://stackoverflow.com/questions/50 53290/large-file-upload-though-html-form-more-2-gb – valentinas

+0

Prova a caricare file con un semplice modulo HTML e .. Si romperà? Forse vedrai l'esatto messaggio di errore. –

+0

Grazie a @BogdanBurim Darò questa prova più tardi e aggiornerò – Diplonics

risposta

6

hanno risolto questo problema, quindi grazie a @BogdanBurim per suggerire la parte posteriore per approccio basi:

sono riuscito a caricare un file di 3,8 GB su HTTP con le seguenti impostazioni:

In Apache2 I' ve impostare la seguente:

- apache2.conf I've set Timeout to 900 
- httpd.conf I've set LimitRequestBody to 0 
- .htaccess in the file upload directory I've set: 
    - LimitRequestBody to 0 
    - php_value upload_max_filesize 0 
    - php_value post_max_size 4939212390 
- .htaccess in the php temp directory (in my case its /tmp/) I've set: 
    - LimitRequestBody to 0 
    - php_value upload_max_filesize 0 
    - php_value post_max_size 4939212390 

In php.ini ho impostato il seguente:

- UPLOAD_MAX_FILESIZE 0 
- POST_MAX_SIZE 4939212390 
- max_execution_time 120 
- max_input_time 60 
- memory_limit 128M 
.210

L'altra parte importante di questa soluzione era dover rimuovere il MAX_FILE_SIZE, HTML dal modulo di caricamento:

<input type="hidden" name="MAX_FILE_SIZE" value="4939212390" /> 

Avendo questo set continuamente causato un PHP tipo 2 errore, quindi php non poteva gestire la maggiore Numero intero a 32 bit impostato. La rimozione ha causato errori di tipo 1 di PHP fino a quando ho cambiato UPLOAD_MAX_FILESIZE a 0 ovunque e hey presto ora funziona !!!!

http://php.net/manual/en/features.file-upload.errors.php

+0

Hai eseguito il test in tutte le versioni del browser (IE 7+ e FF12 +) e funziona in tutti questi browser? Usare semplicemente 'HTML''

+0

@VikasV Non l'ho ancora provato su nessuna piattaforma IE, ma lo farò ora. Funziona bene su FF e CH, tuttavia il problema non è mai stato il browser client per me. Sia in FF che in CH se inviato il file ma segnalato sempre un problema di caricamento parziale di file per file da 2 GB + sul server, che è stato corretto per me come da impostazioni precedenti. – Diplonics

+0

LimitRequestBody imposta come predefinito '0' (illimitato) in [Apache 2.4] (https://httpd.apache.org/docs/2.4/mod/core.html#limitrequestbody), forse anche in altre versioni. – chb

-7

La domanda è perché si usa il browser per caricare> 1 GB. Considerare i servizi di condivisione dei file più limitati la dimensione massima di caricamento dei file a 1 GB tramite browser. Cosa succede se il download dell'utente fallisce, è necessario riavviare l'intero processo.

Hai guardato alle alternative se disponi di upload di file di grandi dimensioni, torrent, ftp o client di upload personali come rapidshare, fileupload, megaupload, ecc.

Si è limitato a causa del limite della dimensione del file impostato su POST. Se si è determinati a utilizzare HTTP per caricare file di dimensioni maggiori che scoraggerei, la soluzione ottimale sarebbe quella di dividere il file e caricare le parti più piccole, quindi riassemblare il file.

+0

magari [s] sta costruendo il prossimo servizio di condivisione ... – mgarciaisaia

+2

"Cosa succede se il download da parte dell'utente fallisce, dovresti riavviare l'intero processo." emmm, no? http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.16 – valentinas

+0

Sì, funziona molto bene finendo nei file corrotti. È stupido caricare file così grandi in questo modo. –

0

Se si ha accesso al apache virtualhost config è anche possibile modificare queste impostazioni per un URL specifico di upload (è possibile aggiungere anche questo al vostro file .htaccess):

Con questo codice:

<LocationMatch "/index.php/url-of-your-upload.php"> 
    php_value max_execution_time 0 
    php_value upload_max_filesize 0 
    php_value post_max_size 4939212390 
    php_value memory_limit 4G 
    LimitRequestBody 0 
</LocationMatch> 

le direttive LocationMatch consentono di scegliere l'url (è possibile utilizzare reg exp)

+0

Questo mi ha dato un errore di 500 quando l'ho inserito nel mio file .htaccess. –

Problemi correlati