web-dev-qa-db-ja.com

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

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

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

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

さて、問題は、ブラウザに12ギガバイト以上のアーカイブファイルをキューに入れてサーバーに転送することをお勧めするかどうかです。このファイルは、S3に移動する前に属性のスキャンを行います。

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

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

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

8
Jason

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

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

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

  1. Python使用するスクリプト Boto3のMultipart Upload を記述します
  2. Boto3メソッド呼び出しは、オブジェクトへの参照を返します。次に、オブジェクトをPOSTedしてREST APIエンドポイントにできます。
  3. サーバーは、高速ファイバー接続を介してほぼ即座にファイルを取得し、非同期ジョブを開始して時間を処理します。
1
Jason