2011-11-23 48 views
17

Me pregunto si hay alguna ramificación en la carga de archivos de aproximadamente 4GB de tamaño a través de una aplicación web usando Django/Python. Recuerdo que en el pasado, las cargas de transmisión con Java era el método preferido, pero ¿todavía lo hace hoy o es perfectamente seguro hacerlo con Django/Python?Carga de archivos de gran tamaño con Python/Django

+0

"perfectamente seguro"? Siempre ha sido perfectamente seguro. ¿Qué podría ser "inseguro" al respecto? ¿Qué te preocupa? ¿Qué problemas te gustaría evitar? –

+4

Java o similar (como un complemento del navegador, esa parte es la clave) se ha utilizado para este tipo de cosas en el pasado porque puede dar cuenta de los inicios, las paradas y la reanudación de las transferencias. Cargar 4GB a través de HTTP es una locura (simplemente usando un campo de carga de archivo estándar). Período. –

+3

Chris, ¿Por qué es una locura? ¿Puedes dar más detalles? ¿Puede sugerir una alternativa dado el hecho de que el archivo cargado es relativo a la aplicación web y la cuenta de usuario para que FTP, etc. no sea una solución? – JeffC

Respuesta

19

Django de forma predeterminada, colocará datos de archivos cargados en la memoria si es menor a 2.5MB. Cualquier cosa más grande se escribirá en el directorio /tmp del servidor y luego se copiará cuando se complete la transferencia. Muchas de las configuraciones de carga de archivos de Django se pueden personalizar, los detalles están disponibles en . También puede personalizar el manejo de archivos y seguramente querrá hacer esto.

Antes de considerar cualquier restricción técnica, cargar archivos tan grandes con el navegador dará al usuario una experiencia muy pobre. No hay comentarios sobre cómo se realiza la transferencia (aunque Google Chrome muestra el estado de carga como un porcentaje) y no hay forma de pausar o reanudar las transferencias.

También es probable que tenga problemas en el servidor. Además del extremadamente largo tiempo que cada hilo se tomará al tratar con los datos transmitidos, tiene el tiempo que le toma al sistema copiar el archivo resultante desde /tmp a su ubicación correcta.

A menos que tenga mucha confianza en que puede prever cualquier problema que pueda tener el servidor con las cargas, sugeriría que esta es una mala idea. Es bastante difícil encontrar información sobre esto a través de google y parece que hay muchos éxitos que describen problemas con grandes cargas de archivos.

Si bien Django es técnicamente capaz de recibir archivos cargados así de grandes, la escasa experiencia del usuario y las dificultades técnicas hacen que este no sea el mejor enfoque. ¿Ha considerado usar un software dedicado para manejar la transferencia de archivos?

+3

Hola adamnfish, gracias por la respuesta completa. He considerado un servicio por separado, mi único problema es que esta es una aplicación web específica para grupos específicos, que cargarán películas completas que han creado, que pueden ser ~ 4GB, por lo que estoy estableciendo un límite de 4 GB. La idea es que podrán subir estos archivos y estarán vinculados a su cuenta. Pueden tener varios archivos en su cuenta. Soy consciente de la experiencia del usuario y ellos están bien y están de acuerdo con eso, solo tengo que encontrar la mejor manera de hacerlo para que no haya problemas en el servidor – JeffC

+1

Use ['django-chunked-uploads'] (https : //github.com/juliomalegria/django-chunked-upload)!(descargo de responsabilidad: escribí esa biblioteca). – juliomalegria

5

La última respuesta lo cubre. Rutinariamente pongamos 2,5 MB + (pero por lo general no 4gb)

enlace adamnish es correcta, consulte este fragmento (de su link to django docs) con respecto a escribir el archivo en el disco, en lugar de tener en la memoria en primer lugar:

def handle_uploaded_file(f): 
    with open('some/file/name.txt', 'wb+') as destination: 
     for chunk in f.chunks(): 
      destination.write(chunk) 

más información sobre los "trozos" llamar: https://docs.djangoproject.com/en/dev/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.chunks

página incluye cómo configurar el tamaño "trozo", etc.

Cuestiones relacionadas