Como remover as limitações de tamanho do arquivo de upload
Para configurar uma configuração LAMP (Linux, Apache, MySQL, PHP) que permite que um usuário carregue arquivos grandes em seus servidores, o seguinte deve ser feito:
Altere as seguintes variáveis em php.ini
-
memory_limit
= 1000M - Defina o limite de memória para o que está disponível no sistema -
post_max_size
= 4G - Garanta que esse valor seja maior ou igual ao valorupload_max_filesize
-
upload_max_filesize
= 4G - Defina isto para o que você quer que o máximo seja -
upload_tmp_dir:
/mnt/raid10/Files/Temp
- Por padrão, isso é desativado, o que torna o local temporário no mesmo disco em que o sistema operacional está instalado. No meu caso de executar tudo fora de um Raspberry Pi, isso torna o cartão SD. Para ter menos restrição, defino isso para o local da unidade de rede.
Depois de fazer o acima, a limitação no tamanho do upload do arquivo é a memória física disponível para o dispositivo, o que estiver definido para memory_limit
e as limitações do sistema de arquivos (4GB para uma estrutura de arquivos FAT). No caso do meu Raspberry Pi 3, isso foi 1GB.
Ignorando o limite de memória para enviar um arquivo maior do que a quantidade de memória disponível
A única maneira de ultrapassar o limite de memória é dividir o upload. Quando o chunking está ativado, o que acontece durante um upload é o seguinte:
- Upload iniciado na página da Web.
- Os dados do arquivo de origem são transmitidos para a memória do servidor da Web.
- Os dados são despejados da memória do servidor da Web para o local do arquivo temporário.
- Quando o arquivo temporário atingir o tamanho da parte que foi definido, esses dados serão despejados no arquivo de local de destino final e o arquivo temporário será excluído.
- Repita a etapa 2 até que o arquivo seja concluído.
Como usar o chunking
Se você estiver usando um gerenciador de downloads semelhante a este ( link ), há muitas opções incorporadas disponíveis.
No meu caso, onde o #fileupload é declarado, adicionei uma linha para maxChunkSize
:
$('#fileupload').fileupload({
maxChunkSize: 10 * 1024 * 1024, // 10 MB <-----This is the line I added
add: function (e, data) {
blah blah blah
}
});
}
});
Qualquer valor colocado aqui será o tamanho do pedaço usado. O tamanho que você escolheu leva um pouco de experimento como um que é pequeno diminuirá bastante a velocidade de upload, e um muito grande fará com que o usuário do site não veja nenhum progresso em sua barra de progresso por algum tempo. Para mim 10MB foi um meio feliz.
* Observe que a barra de progresso para o upload será movida somente quando cada parte começar, então ela se torna mais instável do que uma boa barra de progresso contínuo, mas eu estou realmente bem com isso.