入力ファイルのダウンロード
入力ファイルがアップロードされ確定されると、API経由で再度ダウンロードできます。
確定済み入力ファイルを持つBundleとread:bundleスコープを保持していることを前提としています。
ダウンロードエンドポイントはすぐに使える署名付きURLを返します。スキャンファイルのダウンロードと同じパターンで、GETリクエストにAuthorizationヘッダーなしでCDN/S3から直接ファイルバイトをダウンロードします。
sequenceDiagram
participant Client as RCAPI client
participant RCAPI as RCAPI
participant CDN as CDN / S3
Client->>RCAPI: GET input-files (page, limit)
RCAPI-->>Client: items with signed urls + total
loop for each item
Client->>CDN: GET url
CDN-->>Client: file bytes
end
RCAPIはリクエストごとにBundleの入力プレフィックスに1回署名します。各アイテムのurlは、その署名にファイルのストレージパスを置き換えたものであるため、1つのレスポンス内のすべてのURLは同じ有効期限を共有します。
エンドポイント
Section titled “エンドポイント”| メソッド | パス | スコープ | 用途 |
|---|---|---|---|
GET | /v1/bundles/{bundleId}/input-files | read:bundle | 確定済み入力ファイルの署名付きダウンロードURLの一覧 |
入力ファイルダウンロードURLの一覧
Section titled “入力ファイルダウンロードURLの一覧”GET {api_url}/v1/bundles/{bundleId}/input-files?page=1&limit=20Authorization: Bearer {access_token}クエリパラメータ
Section titled “クエリパラメータ”| パラメータ | 型 | 説明 |
|---|---|---|
page | number | 1始まりのページインデックス(デフォルト1) |
limit | number | ページサイズ(デフォルト20、最大20) |
sessionId | uuid | 任意。1つのアップロードセッションのファイルに結果を限定 |
ソートは提供されません。ファイルは安定したストレージ順序で返されます。
ページネーションされたリスト({ items, total }):
{ "items": [ { "fileName": "scan.las", "url": "https://cdn…/bundles/…/scan.las?X-Amz-…", "sessionId": "6ebf0fe5-4428-4b26-a7e4-e3274980123b" }, { "fileName": "panorama/2024-07-scan-idx40.jpg", "url": "https://cdn…/bundles/…/panorama/2024-07-scan-idx40.jpg?X-Amz-…", "sessionId": "6ebf0fe5-4428-4b26-a7e4-e3274980123b" } ], "total": 28}| フィールド | 意味 |
|---|---|
fileName | 入力ファイルの名前(署名付きプレフィックスに置き換えられるパス) |
url | 署名付きダウンロードURL。認証ヘッダーなしでGET可能 |
sessionId | ファイルが属するアップロードセッション |
total | すべてのページにわたる確定済み入力ファイルの合計 |
バイトのダウンロード
Section titled “バイトのダウンロード”各アイテムについて、urlを直接GETします。Bearerトークンは不要です。署名はクエリ文字列に埋め込まれています。
import requests
response = requests.get(item["url"])response.raise_for_status()
with open(local_path, "wb") as handle: handle.write(response.content)期限切れURL
Section titled “期限切れURL”1つのレスポンス内のすべてのURLは単一の署名有効期限(約24時間、APIの他の署名付きリンクと同様)を共有します。ダウンロードが403 Forbiddenを返す場合、URLの有効期限が切れています。一覧エンドポイントから新しいページをリクエストして再試行してください。
大規模Bundleのページネーション
Section titled “大規模Bundleのページネーション”totalがlimitを超える場合、結果をページングします:
import requests
API_URL = "https://<your-regional-api-url>"TOKEN = "<access_token>"BUNDLE_ID = "<bundleId>"LIMIT = 20
headers = {"Authorization": f"Bearer {TOKEN}"}base = f"{API_URL}/v1/bundles/{BUNDLE_ID}/input-files"
page = 1while True: listing = requests.get( base, headers=headers, params={"page": page, "limit": LIMIT} ).json()
for item in listing["items"]: local_name = item["fileName"].replace("/", "_") data = requests.get(item["url"]) data.raise_for_status() with open(local_name, "wb") as handle: handle.write(data.content) print(f"Downloaded {item['fileName']}")
if page * LIMIT >= listing["total"]: break page += 1このエンドポイントを使用するタイミング
Section titled “このエンドポイントを使用するタイミング”| ユースケース | 備考 |
|---|---|
| アーカイブ | アップロード後に生キャプチャを独自ストレージにコピー |
| 再処理 | 入力をローカルにダウンロードし、新しいBundleにアップロード |
| 監査 / 検証 | 処理前にBundleにどのファイルが到着したかを確認 |
| 統合テスト | CIパイプラインでアップロードとダウンロードのラウンドトリップ |
このエンドポイントは入力ファイル(アップロードしたもの)のみを返します。処理済み出力(HLOD、標準化点群など)は、GET /v1/site/{siteId}/bundles/{bundleId}のBundleコンポーネント署名付きリンクとして公開されます。処理済み出力の取得を参照してください。
エラーケース
Section titled “エラーケース”| ステータス | 原因 |
|---|---|
403 Forbidden | read:bundleスコープがない、またはBundleへの読み取り権限がない |
404 Not Found | 不明なbundleId |
total: 0の空のitems配列は、Bundleにまだ確定済み入力ファイルがないことを意味します。先にアップロードセッションを完了してください。Data Bundleへのデータアップロードを参照してください。