Opciones para manejar cargas de archivos grandes (multi-gigabytes)

8

¿Cómo implementaría una funcionalidad de carga de archivos muy grande con una aplicación Django y S3?

En mi trabajo secundario como fotógrafo, tengo varios clientes para los que necesito compartir archivos de varios gigabytes (zip, tar) que contienen los originales y las imágenes procesadas del evento en cuestión. Hasta ahora, hemos estado usando Google Drive para esto, en el que subiría el archivo a GD y lo recuperarían y guardarían en una unidad de almacenamiento local. En ocasiones, limpiaba la carpeta GD, ya que los archivos cargados allí se reflejan en mi computadora a través del cliente Mac Google Drive. Dado que mi Mac solo tiene una unidad integrada de 256 GB, el espacio es muy escaso.

Un cliente ha tenido dos fallas en el disco duro en los últimos cuatro meses, donde hubo cero en los diez años anteriores en que había sido empleado por ellos. Entonces quieren una mejor solución, y ya soy desarrollador, ¿por qué no?

Ahora, la pregunta es si es una buena idea hacer que el navegador sea responsable de la cola y el transporte de un archivo de almacenamiento de más de doce gigabytes a mi servidor, para lo cual pasará por un escaneo de atributos antes de pasar a S3.

Puedo ver dos opciones con esto:

  1. Use el navegador con un formulario de carga de archivos para cargar un archivo de varias partes en el servidor. Una vez completado, el archivo será revisado y procesado por una tarea local de Celery, y luego cargado en un cubo S3.
  2. Implemente un comando de administración de Django para activar la ejecución de la tarea local de procesamiento de archivos de Celery, y use un script local de Python usando Paramiko para cargar el archivo y activar la ejecución del comando de administración cuando se complete la carga.

Personalmente, me estoy inclinando hacia la Opción 2, pero quisiera otras ideas si es posible.

Jason
fuente
3
No estoy familiarizado con los detalles de Django y Celery, pero sea cual sea la solución que elija, probablemente debería hacerlo tan robusto que pueda continuar una carga parcialmente exitosa más tarde después de una interrupción. La utilización de archivos de varias partes puede ser una buena idea para esto, junto con sumas de verificación para cada parte.
Doc Brown
Sin embargo, trataría de resistir la tentación de reinventar rsync . Parece que es la herramienta para su trabajo.
5gon12eder

Respuestas:

1

A través de conversaciones con otros sobre este tema, creo que he reunido una solución:

  1. Sube el archivo a S3
  2. La acción de carga devuelve una ID de S3, que se puede enviar a un punto final de API
  3. El servidor recupera el archivo y lo pasa a la tarea de Celery para su procesamiento.
  4. OPCIONAL : el correo electrónico se envía al usuario / grupo para el cual

Para lograr esto, se deberá hacer lo siguiente:

  1. Escriba un script de Python para usar la Carga multiparte de Boto3
  2. La llamada al método Boto3 devolverá una referencia al objeto, que luego puede ser POSTeditado a un punto final API REST
  3. El servidor recupera el archivo casi de inmediato a través de una conexión de fibra rápida e inicia un trabajo asíncrono para procesar el tiempo.
Jason
fuente