跳到主要內容

GetObjectCommand

GetObjectCommand 用於從您的 DID Space 中擷取或下載物件。物件的內容會以可讀流的形式返回,使其能夠高效處理任何大小的檔案,而不會消耗過多記憶體。

在您的應用程式中,任何下載功能都會用到此命令。

輸入

此命令需要一個參數來指定要擷取的物件。

  • key string (required) — 要下載物件的唯一金鑰(路徑和檔案名稱)。例如:'photos/profile.jpg' 或 'documents/report.pdf'。

輸出

請求成功後,此命令會返回一個物件,其中包含狀態、標頭以及作為資料流的物件內容。

  • statusCode number — 回應的 HTTP 狀態碼。值為 200 表示成功。
  • statusMessage string — 對應於狀態碼的 HTTP 狀態訊息。
  • headers RawAxiosResponseHeaders | AxiosResponseHeaders — 一個包含 HTTP 回應標頭的物件。其中可包含 'content-type'、'content-length' 等元數據。
  • data Readable — 一個包含物件資料的 Node.js 可讀流。您可以將此流傳輸到檔案、另一個流,或直接處理其資料區塊。

使用範例

此範例示範如何從您的 DID Space 下載物件並將其儲存為本地檔案。它使用 Node.js 的 stream/promises 模組中的 pipeline 函數,以更簡潔、更穩健的方式處理流。

使用 Pipeline 下載物件

typescript
import { SpaceClient, GetObjectCommand } from '@blocklet/did-space-js';
import getWallet from '@blocklet/sdk/lib/wallet';
import fs from 'fs';
import path from 'path';
import { pipeline } from 'stream/promises';

// 1. 初始化 SpaceClient
const client = new SpaceClient({
  auth: {
    endpoint: 'https://www.didspaces.com/app/api/space/...',
    wallet: getWallet(),
  },
});

// 2. 定義要下載的物件金鑰和本地檔案路徑
const objectKey = 'path/to/your/file.txt';
const localFilePath = path.join(__dirname, 'downloaded_file.txt');

async function downloadObject() {
  try {
    // 3. 建立並發送 GetObjectCommand
    const command = new GetObjectCommand({ key: objectKey });
    const output = await client.send(command);

    // 4. 檢查請求是否成功
    if (output.statusCode === 200 && output.data) {
      console.log(`Successfully started downloading ${objectKey}`);

      // 5. 建立一個可寫流以儲存檔案
      const writer = fs.createWriteStream(localFilePath);

      // 6. 使用 pipeline 高效傳輸資料並處理錯誤
      await pipeline(output.data, writer);

      console.log(`File downloaded successfully and saved to ${localFilePath}`);
    } else {
      // 如果下載失敗,拋出一個錯誤,以便由 catch 區塊捕獲
      throw new Error(`Failed to download object. Status: ${output.statusCode}, Message: ${output.statusMessage}`);
    }
  } catch (err) {
    console.error('An error occurred during the download process:', err);
  }
}

downloadObject();

範例回應(成功時)

上述程式碼中的 output 變數會像這樣。請注意,data 是一個流物件,而不是實際的檔案內容。

回應結構

json
{
  "statusCode": 200,
  "statusMessage": "OK",
  "headers": {
    "x-amz-id-2": "...",
    "x-amz-request-id": "...",
    "date": "Wed, 29 May 2024 08:30:00 GMT",
    "last-modified": "Tue, 28 May 2024 10:15:00 GMT",
    "etag": "\"...\"",
    "x-amz-server-side-encryption": "AES256",
    "accept-ranges": "bytes",
    "content-type": "application/octet-stream",
    "server": "SpaceServer",
    "content-length": "1024"
  },
  "data": "<ReadableStream>"
}

最佳實踐

處理流

GetObjectCommand 的主要優勢在於它使用流。這對於大型檔案尤其重要,因為它能防止您的應用程式一次將整個檔案載入記憶體。務必透過將 data 流傳輸到目的地來消費它。

錯誤管理

為實現穩健的流處理,我們強烈建議使用範例中所示的 Node.js stream/promises 模組中的 pipeline 函數。它透過自動管理資料流、處理背壓以及從流鏈的任何部分傳播錯誤來簡化程式碼。這消除了對 errorfinish 進行手動事件監聽的需要,讓您可以使用標準的 try...catch 區塊來進行更清晰、更可靠的錯誤管理。