このチュートリアルでは、重複したファイル、重複したフォルダ、サイズの大きなファイルを自動的に処理するために、、、を組み合わせた再帰的アップロードスクリプトを作成する方法を説明します。
このチュートリアルのコードサンプルでは、 を使用しています。
前提条件
- Boxアプリケーションで [] スコープ (
root_readwrite) が有効になっている
- コンピュータにPython 3.8以降がインストールされている
- Box Python SDKがインストールされている (
pip install "boxsdk~=10")
- が認証済みである
- のチュートリアルが完了している (同チュートリアルで定義した
file_uploadおよびfile_upload_chunkedヘルパー関数をこのチュートリアルで再利用し、アップロードロジックの重複を回避する)
重複したフォルダの処理
サブフォルダにアクセスする前に、そのフォルダがすでにBoxに存在しているかどうかを確認します。同名のフォルダが存在する場合は、新規フォルダを作成せずに、既存のフォルダを使用します。
from box_sdk_gen import BoxAPIError, CreateFolderParent
def create_or_get_box_folder(client, folder_name, parent_folder_id):
try:
folder = client.folders.create_folder(
folder_name, CreateFolderParent(id=parent_folder_id)
)
except BoxAPIError as err:
if err.response_info.body.get("code") == "item_name_in_use":
folder_id = err.response_info.context_info["conflicts"][0][
"id"
]
folder = client.folders.get_folder_by_id(folder_id)
else:
raise
return folder
フォルダの再帰的なアップロード
ローカルディレクトリツリーをたどる1つの再帰的な関数を、複数のヘルパー関数を組み合わせて作成します。各項目で、関数は次の処理を行います。
- Box内にフォルダを作成するか、既存のフォルダを取得した後、フォルダを再帰的に処理します。
- 直接アップロードか分割アップロードかを選択するためにファイルサイズを確認します。20 MB以上のファイルでは分割アップロード、それよりも小さいファイルでは直接アップロードを使用します。
- 同名のファイルがすでに存在する場合は、アップロード方法のチュートリアルで説明したヘルパーを使用して新しいバージョンをアップロードします。
import pathlib
MIN_CHUNKED_SIZE = 20 * 1024 * 1024 # 20 MB
def folder_upload(
client,
box_base_folder_id,
local_folder_path,
min_chunked_size=MIN_CHUNKED_SIZE,
):
local_folder = pathlib.Path(local_folder_path)
for item in local_folder.iterdir():
if item.is_dir():
new_box_folder = create_box_folder(
client, item.name, box_base_folder_id
)
folder_upload(client, new_box_folder.id, item, min_chunked_size)
else:
if item.stat().st_size < min_chunked_size:
file_upload(client, str(item), box_base_folder_id)
else:
file_upload_chunked(client, str(item), box_base_folder_id)
min_chunked_sizeパラメータのデフォルト値は20 MB (の最小サイズ) です。このしきい値を大きくすることはできますが、小さくすることはできません。
サンプル全体
以下のスクリプトでは、Boxクライアントを認証し、保存先フォルダを作成 (または既存フォルダを再利用) して、ローカルディレクトリのコンテンツを再帰的にアップロードします。create_box_folderヘルパーを再利用して、ルートフォルダ ("0") にある保存先フォルダを取得または作成しています。
def main():
client = get_authenticated_client()
demo_folder = create_box_folder(client, "my-upload-folder", "0")
folder_upload(client, demo_folder.id, "/path/to/local/folder")
if __name__ == "__main__":
main()
リソース