Opções para lidar com uploads de arquivos grandes (vários gigabytes)

8

Como você implementaria uma funcionalidade de upload de arquivos muito grande com um aplicativo Django e S3?

No meu trabalho paralelo como fotógrafo, tenho vários clientes para os quais tenho necessidade de compartilhar arquivos compactados (zip, tar) com vários gigabytes que contenham os originais e as imagens processadas do evento em questão. Até agora, usamos o Google Drive para isso, no qual eu carregava o arquivo no GD e eles recuperavam e salvavam em uma unidade de armazenamento local. Ocasionalmente, eu limpava a pasta GD, pois os arquivos enviados são espelhados no meu computador por meio do cliente Mac Google Drive. Como o meu Mac possui apenas uma unidade de 256 GB, o espaço é escasso.

Um cliente teve duas falhas no disco rígido nos últimos quatro meses, onde havia zero nos dez anos anteriores em que eu trabalhava com eles. Então eles querem uma solução melhor, e eu já sou desenvolvedor, por que não?

Agora, a questão é se é uma boa idéia que o navegador seja responsável pelo enfileiramento e transporte de um arquivo de mais de 12 gigabytes para o meu servidor, pelo qual passará por alguma verificação de atributo antes de ser transferido para o S3.

Eu posso ver duas opções com isso:

  1. Use o navegador com um formulário de upload de arquivo para fazer upload de um arquivo com várias partes para o servidor. Após a conclusão, o arquivo será verificado e processado por uma tarefa local do Aipo e, em seguida, carregado em um bucket S3.
  2. Implemente um comando Django Management para acionar a execução da tarefa local de processamento de arquivos do Celery e use um script Python local usando o Paramiko para carregar o arquivo e acionar a execução do comando de gerenciamento quando o upload for concluído.

Pessoalmente, estou me inclinando para a opção 2, mas gostaria de outras idéias, se possível.

Jason
fonte
3
Eu não sou familiar com os detalhes do Django e do Aipo, mas seja qual for a solução que você escolher, você provavelmente deve ser tão robusto que possa continuar um upload parcialmente bem-sucedido posteriormente, após uma interrupção. A utilização de arquivos com várias partes pode ser uma boa idéia para isso, juntamente com somas de verificação para cada parte.
Doc Brown
Eu tentaria resistir à tentação de reinventar o rsync , no entanto. Parece que é a ferramenta para o seu trabalho.
5gon12eder

Respostas:

1

Por meio de conversas com outras pessoas sobre esse tópico, acho que montei uma solução:

  1. Faça o upload do arquivo morto para o S3
  2. A ação de upload retorna um ID S3, que pode ser enviado para um terminal da API
  3. O servidor recupera o arquivo e passa para a tarefa do Aipo para processamento.
  4. OPCIONAL : o email é enviado ao usuário / grupo para o qual o

Para isso, será necessário o seguinte:

  1. Escreva um script Python para usar o Multipart Upload do Boto3
  2. A chamada do método Boto3 retornará uma referência ao objeto, que pode ser POSTeditada em um terminal da API REST
  3. O servidor recupera o arquivo quase imediatamente por uma conexão rápida de fibra e inicia um trabalho assíncrono para processar o tempo.
Jason
fonte