Opsi untuk menangani unggahan file besar (multi-gigabyte)

8

Bagaimana Anda menerapkan fungsionalitas unggah file yang sangat besar dengan aplikasi Django dan S3?

Dalam pekerjaan sampingan saya sebagai fotografer, saya memiliki beberapa klien yang saya perlukan untuk berbagi file arsip multi-gigabyte (zip, tar) dengan yang berisi dokumen asli serta gambar yang diproses dari acara tersebut. Sampai sekarang, kami telah menggunakan Google Drive untuk ini, di mana saya akan mengunggah file ke GD dan mereka akan mengambil dan menyimpan di drive penyimpanan lokal. Saya akan membersihkan folder GD sesekali, karena file yang diunggah di sana dicerminkan di komputer saya melalui klien Mac Google Drive. Mengingat bahwa Mac saya hanya memiliki drive onboard 256GB, ruang di premium.

Satu klien telah mengalami dua kegagalan hard drive selama empat bulan terakhir, di mana tidak ada nol dalam sepuluh tahun sebelumnya yang telah saya pekerjakan. Jadi mereka menginginkan solusi yang lebih baik, dan saya sudah menjadi pengembang, jadi mengapa tidak?

Sekarang, pertanyaannya adalah apakah ide yang baik untuk membuat browser bertanggung jawab atas antrian dan transportasi file arsip dua belas-plus gigabyte ke server saya, di mana ia akan melalui beberapa pemindaian atribut sebelum dipindahkan ke S3.

Saya dapat melihat dua opsi dengan ini:

  1. Gunakan browser dengan formulir unggah file untuk mengunggah file Multi-Bagian ke server. Setelah selesai, file akan diperiksa dan diproses oleh tugas Seledri lokal, dan kemudian diunggah ke ember S3.
  2. Menerapkan perintah Manajemen Django untuk memicu pelaksanaan tugas pemrosesan file lokal Seledri, dan menggunakan skrip Python lokal menggunakan Paramiko untuk mengunggah file dan memicu pelaksanaan perintah manajemen saat unggahan selesai.

Secara pribadi, saya condong ke Opsi 2, tetapi ingin ide lain jika memungkinkan.

Jason
sumber
3
Saya tidak tahu detail Django dan Celery, tetapi solusi apa pun yang Anda pilih, Anda mungkin harus membuatnya sangat kuat sehingga Anda dapat melanjutkan unggahan yang sebagian berhasil di lain waktu setelah gangguan. Memanfaatkan arsip multi-bagian mungkin merupakan ide yang baik untuk ini, bersama dengan checksum untuk setiap bagian.
Doc Brown
Saya akan mencoba menahan godaan untuk menemukan kembali rsync . Sepertinya itu adalah alat untuk pekerjaan Anda.
5gon12eder

Jawaban:

1

Melalui percakapan dengan orang lain tentang topik ini, saya pikir saya telah mengumpulkan solusi:

  1. Unggah file arsip ke S3
  2. Tindakan unggah mengembalikan ID S3, yang dapat dikirim ke titik akhir API
  3. Server mengambil file dan meneruskan ke tugas Seledri untuk diproses.
  4. OPTIONAL : email dikirim ke pengguna / grup yang mana

Untuk mencapai ini, hal-hal berikut harus dilakukan:

  1. Tulis skrip Python untuk menggunakan Boto3's Multipart Upload
  2. Pemanggilan metode Boto3 akan mengembalikan referensi ke objek, yang kemudian dapat POSTdiedit ke titik akhir REST API
  3. Server segera mengambil file melalui koneksi serat cepat dan memulai pekerjaan async untuk memproses waktu.
Jason
sumber