コンテンツにスキップ

入力ファイルのダウンロード

入力ファイルがアップロードされ確定されると、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は同じ有効期限を共有します。

メソッドパススコープ用途
GET/v1/bundles/{bundleId}/input-filesread:bundle確定済み入力ファイルの署名付きダウンロードURLの一覧

入力ファイルダウンロードURLの一覧

Section titled “入力ファイルダウンロードURLの一覧”
GET {api_url}/v1/bundles/{bundleId}/input-files?page=1&limit=20
Authorization: Bearer {access_token}
パラメータ説明
pagenumber1始まりのページインデックス(デフォルト1
limitnumberページサイズ(デフォルト20、最大20
sessionIduuid任意。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すべてのページにわたる確定済み入力ファイルの合計

各アイテムについて、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)

1つのレスポンス内のすべてのURLは単一の署名有効期限(約24時間、APIの他の署名付きリンクと同様)を共有します。ダウンロードが403 Forbiddenを返す場合、URLの有効期限が切れています。一覧エンドポイントから新しいページをリクエストして再試行してください。

大規模Bundleのページネーション

Section titled “大規模Bundleのページネーション”

totallimitを超える場合、結果をページングします:

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 = 1
while 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コンポーネント署名付きリンクとして公開されます。処理済み出力の取得を参照してください。

ステータス原因
403 Forbiddenread:bundleスコープがない、またはBundleへの読み取り権限がない
404 Not Found不明なbundleId

total: 0の空のitems配列は、Bundleにまだ確定済み入力ファイルがないことを意味します。先にアップロードセッションを完了してください。Data Bundleへのデータアップロードを参照してください。