IBM Cloud Docs
cURL を使用してマルチパートアップロードを実行する

cURL を使用してマルチパートアップロードを実行する

このチュートリアルでは、 Linux オペレーティングシステム上で cURL コマンドを使用して、複数の部分に分割した大きなファイルをアップロードする方法を学びます。 手順には、ファイルを分割するためにターミナルウィンドウで分割を実行すること、アップロードを開始すること、分割をアップロードすること、アップロードを完了することが含まれます。 さらに、このチュートリアルでは、各ファイル部分をアップロードし、その実体タグ(ETag)を取得するスクリプトを使用し、マルチパートアップロード操作を完了するために必要なXMLブロックを生成します。

シナリオ

CLIや IBM Cloud® コンソール、互換性のあるライブラリやSDKなど、ほとんどのツールは、マルチパートアップロードでオブジェクトを自動的に転送する。 マルチパートアップロード操作の詳細については 、「大きなオブジェクトの保存」 を参照してください。 一部のシナリオでは、例えば、CLIをインストールできない読み取り専用のオペレーティングシステムで作業している場合など、マルチパートアップロードには cURL コマンドを使用する方が望ましい場合があります。

開始前に

アップロードを開始する前に、次のものが必要です

curl を使うには、コマンドラインと IBM Cloud® にある程度慣れていて、 サービス・クレデンシャルエンドポイント・リファレンス、または コンソールから 必要な情報を持っていることが前提となる。

ファイルを分割する

マルチパートアップロードの場合、すべてのファイルパート(最後のパートを除く)は少なくとも5MBでなければなりません。 ファイルを分割するには、ターミナル・ウィンドウでsplitを実行する。 ファイルの総サイズを考慮して分割方法を決める際には、マルチパートアップロードでは最大10,000( 10k )個のパーツまでであることを念頭に置いてください。

次の例では、分割コマンドは -b オプションを使用し、値は 100M、ファイル名は TESTFILE.iso、接頭辞は「part-」です。

split -b 100M TESTFILE.iso part-

このコマンドは、指定されたサイズのファイル部分を生成し、part-aa、part-ab、part-ac、というように名前を付けます。

アップロードを開始し、取得する UploadID

新しいマルチパートアップロードを開始するには、 cURL を実行して、クエリパラメータ uploads を持つオブジェクトに POST リクエストを発行します。これにより、新しい UploadId 値が作成されます。 アップロードするオブジェクトの各部分について、 UploadID を参照します。

要求の例

curl -X "POST" "https://s3.private.us-south.cloud-object-storage.appdomain.cloud/mputest/TESTFILE.iso?uploads"
-H "Authorization: bearer $bearertoken"

応答の例

_<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<InitiateMultipartUploadResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Bucket>mputest</Bucket>
    <Key>TESTFILE.iso</Key>
    <UploadId>01000194-8fab-0f08-3c54-d7df03b4a127</UploadId>
</InitiateMultipartUploadResult>_

応答から、 UploadID をメモする。 この例では、 UploadID の値は 01000194-8fab-0f08-3c54-d7df03b4a127 です。

スクリプトを使用してパーツをアップロードし、XMLブロックを構築する

次に、 cURL を実行して、アップロードしたい各ファイル部分について、 PUT リクエストを発行します。 各部分のアップロードに対するレスポンスヘッダーには ETag 値が含まれています。この値は、マルチパートアップロード操作の最終ステップの入力として保存する必要があります。

各パーツを手動でアップロードする代わりに、以下のような bash スクリプトを使用することができます。 このスクリプトには2つの機能があります

  1. 部品をアップロードする
  2. XMLパートマニフェストを作成します。これは、 /tmp ディレクトリにローカルに保存されます

各ファイル部分がアップロードされると、スクリプトはレスポンスヘッダーからそのETagを抽出し、最終ステップの入力として、ETagとパート番号をXMLブロックに保存します。

スクリプト例

#!/usr/bin/env bash
set -euo pipefail

# ─── Configuration ───────────────────────────────────────────────────────────────
# Public endpoint for your bucket
ENDPOINT="$COS endpoint"
BUCKET="$bucket"
KEY="$Filename"
UPLOAD_ID="$uploadID gained from initiation of upload"
ACCESS_TOKEN="$BEARERTOKEN"
PARTS_PREFIX="part-"
MANIFEST="parts_manifest.xml"
# ─────────────────────────────────────────────────────────────────────────────────

# 1) Start a fresh manifest
cat > "$MANIFEST" <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<CompleteMultipartUpload>
EOF

part=1
for f in ${PARTS_PREFIX}*; do
    if [[ ! -r "$f" ]]; then
    echo "ERROR: no files matching ${PARTS_PREFIX}*" >&2
    exit 1
    fi

    echo "Uploading $f as part $part…"

    # 2) PUT the part, capture headers
    hdrfile=$(mktemp)
    http_code=$(
    curl -sS \
      -D "$hdrfile" \
      -o /dev/null \
      -X PUT "${ENDPOINT}/${BUCKET}/${KEY}?partNumber=${part}&uploadId=${UPLOAD_ID}" \
      -H "Authorization: Bearer ${ACCESS_TOKEN}" \
      --data-binary @"${f}" \
      -w '%{http_code}'
    )

    if [[ "$http_code" != "200" ]]; then
    echo "ERROR: HTTP $http_code for part $part" >&2
    sed 's/^/  /' "$hdrfile" >&2
    rm -f "$hdrfile"
    exit 1
    fi

    # 3) Extract clean ETag (strip quotes/carriage returns)
    etag=$(grep -i '^ETag:' "$hdrfile" \
         | cut -d' ' -f2 \
         | tr -d '"\r')
    rm -f "$hdrfile"

    if [[ -z "$etag" ]]; then
    echo "ERROR: no ETag for part $part" >&2
    exit 1
    fi

    echo " → Part $part ETag: $etag"

    # 4) Append a well-formed <Part> block
    printf '  <Part>\n    <PartNumber>%d</PartNumber>\n    <ETag>"%s"</ETag>\n  </Part>\n' \
    "$part" "$etag" >> "$MANIFEST"

    part=$((part + 1))
done

# 5) Close the manifest
echo '</CompleteMultipartUpload>' >> "$MANIFEST"

echo "✔ Manifest generated: $MANIFEST"


## Complete multipart upload {: #curl-multipart-complete step}

When all parts are finished uploading, you complete the upload by sending a request with the `UploadId` and an XML block that lists each part number and its respective Etag value.

要求の例

curl -X POST "https://s3.private.us-south.cloud-object-storage.appdomain.cloud/mputest/TESTFILE.iso?uploadId=01000194-8fab-0f08-3c54-d7df03b4a127"
 -H "Authorization: Bearer $bearertoken" -H "Content-Type: application/xml" --data-binary @parts_manifest.xml

応答の例

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CompleteMultipartUploadResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Location>http://s3.private.us-south.cloud-object-storage.appdomain.cloud/mputest/TESTFILE.iso</Location>
    <Bucket>mputest</Bucket>
    <Key>TESTFILE.iso</Key>
    <ETag>"1a90419141160aa6713b8d196773345e-94"</ETag>
</CompleteMultipartUploadResult>

次のステップ

問題がなければ、ファイルがバケットにアップロードされたことが確認されます。 エラーが発生した場合は、不完全なマルチパートアップロードを必ずクリーンアップしてください。 不完全なマルチパートのアップロードが停止されない場合、部分アップロードはリソースを使用し続ける。 不完全なマルチパートアップロードを取得または停止するための構文については 、 cURL の使用」 を参照してください。