大きな(数ギガバイト)ファイルのアップロードを処理するオプション


8

DjangoアプリケーションとS3で非常に大きなファイルのアップロード機能をどのように実装しますか?

写真家としての副業で、問題のあるイベントの元の画像と処理された画像を含むマルチギガバイトのアーカイブ(zip、tar)ファイルを共有する必要があるクライアントがいくつかいます。これまでは、これにGoogleドライブを使用してきました。GDにファイルをアップロードし、ローカルストレージドライブにファイルを取得して保存していました。アップロードされたファイルはMacのGoogleドライブクライアントを介してコンピューターにミラーリングされるため、GDフォルダーを時々クリーンアップします。私のMacには256GBのオンボードドライブしかないので、スペースは非常に貴重です。

1つのクライアントで、過去4か月間に2つのハードドライブ障害が発生しました。過去10年間、私が彼らに雇われていたのはゼロでした。彼らはより良いソリューションを望んでおり、私はすでに開発者です。

ここでの問題は、ブラウザに12ギガバイトを超えるアーカイブファイルのキューイングとサーバーへの転送を任せることをお勧めします。このファイルは、S3に移動する前に属性のスキャンを行います。

これには2つのオプションがあります。

  1. ブラウザでファイルアップロードフォームを使用して、マルチパートファイルをサーバーにアップロードします。完了すると、ファイルはローカルのCeleryタスクによってチェックおよび処理され、S3バケットにアップロードされます。
  2. ローカルファイル処理のCeleryタスクの実行をトリガーするDjango管理コマンドを実装し、Paramikoを使用してローカルPythonスクリプトを使用してファイルをアップロードし、アップロードが完了したときに管理コマンドの実行をトリガーします。

個人的には、私はオプション2に傾いていますが、可能であれば他のアイデアを求めています。


3
私はDjangoとCeleryの詳細に精通していませんが、どのようなソリューションを選択する場合でも、おそらく中断して後で部分的に成功したアップロードを継続できるように、堅牢にする必要があります。マルチパートアーカイブを利用することは、各パートのチェックサムと一緒に、このための良いアイデアかもしれません。
Doc Brown、

しかし、私はrsyncを再発明する誘惑に抵抗しようとします。それはあなたの仕事のためのツールのようです。
5gon12eder 2017

回答:


1

このトピックに関する他の人との会話を通じて、私は解決策をまとめたと思います:

  1. アーカイブファイルをS3にアップロードする
  2. アップロードアクションはAPIエンドポイントに送信できるS3 IDを返します
  3. サーバーはファイルを取得し、Celeryタスクに渡して処理します。
  4. オプション:メールは、対象のユーザー/グループに送信されます

これを達成するには、次のことを行う必要があります。

  1. Boto3のマルチパートアップロードを使用するPythonスクリプトを作成する
  2. Boto3メソッド呼び出しは、オブジェクトへの参照を返します。これはPOST、REST APIエンドポイントに編集できます。
  3. サーバーは、高速ファイバー接続を介してほぼ即座にファイルを取得し、非同期ジョブを開始して時間を処理します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.