cURL を使用してマルチパートアップロードを実行する
このチュートリアルでは、 Linux オペレーティングシステム上で cURL コマンドを使用して、複数の部分に分割した大きなファイルをアップロードする方法を学びます。 手順には、ファイルを分割するためにターミナルウィンドウで分割を実行すること、アップロードを開始すること、分割をアップロードすること、アップロードを完了することが含まれます。 さらに、このチュートリアルでは、各ファイル部分をアップロードし、その実体タグ(ETag)を取得するスクリプトを使用し、マルチパートアップロード操作を完了するために必要なXMLブロックを生成します。
シナリオ
CLIや IBM Cloud® コンソール、互換性のあるライブラリやSDKなど、ほとんどのツールは、マルチパートアップロードでオブジェクトを自動的に転送する。 マルチパートアップロード操作の詳細については 、「大きなオブジェクトの保存」 を参照してください。 一部のシナリオでは、例えば、CLIをインストールできない読み取り専用のオペレーティングシステムで作業している場合など、マルチパートアップロードには cURL コマンドを使用する方が望ましい場合があります。
開始前に
アップロードを開始する前に、次のものが必要です
- IBM Cloud アカウント
- IBM Cloud Object Storage のインスタンス
- バケツ
- ローカルシステム上の書き込み可能な空き容量が、アップロードするファイルの合計サイズよりも大きいこと
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つの機能があります
- 部品をアップロードする
- 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 の使用」 を参照してください。