コンテンツにスキップ

MediaUploader

MediaUploader は、メディアアップロードの開始からステータスポーリング・完了待機までを簡略化するヘルパーです。

追加インストールは不要です。mixi2-js に同梱されています。

// ESM
import { MediaUploader } from 'mixi2-js/helpers';
// CJS
const { MediaUploader } = require('mixi2-js/helpers');

メディアをポストに添付するには、3 つのステップが必要です:

  1. initiatePostMediaUpload() でアップロード URL を取得
  2. uploadUrl に HTTP POST でメディアデータを送信
  3. getPostMediaStatus() を繰り返し呼んで処理完了を待機

ステップ 3 のポーリングは自前で実装すると煩雑です:

// ❌ ポーリングを自前実装
const upload = await client.initiatePostMediaUpload(request);
// ... HTTP POST ...
let status;
while (true) {
status = await client.getPostMediaStatus(upload.mediaId);
if (status.status === MediaUploadStatus.COMPLETED) break;
if (status.status === MediaUploadStatus.FAILED) throw new Error("Failed");
await new Promise((r) => setTimeout(r, 1000));
}

MediaUploader を使えば upload()waitForReady() を呼ぶだけです:

// ✅ 簡潔
const uploader = new MediaUploader(client);
const { mediaId, uploadUrl } = await uploader.initiate(request);
await uploader.upload(uploadUrl, imageBuffer);
await uploader.waitForReady(mediaId);
import { MediaUploadType } from 'mixi2-js';
import { MediaUploader } from 'mixi2-js/helpers';
import { readFile } from 'node:fs/promises';
const uploader = new MediaUploader(client);
const imageBuffer = await readFile("image.png");
// 1. アップロード開始(uploadUrl と mediaId を取得)
const { mediaId, uploadUrl } = await uploader.initiate({
contentType: "image/png",
dataSize: imageBuffer.byteLength,
mediaType: MediaUploadType.IMAGE,
});
// 2. メディアデータを送信(Authorization ヘッダーを自動付与)
await uploader.upload(uploadUrl, imageBuffer.buffer);
// 3. 完了まで待機
await uploader.waitForReady(mediaId);
// 4. ポストに添付
await client.createPost({
text: "画像付きポスト!",
mediaIdList: [mediaId],
});
const uploader = new MediaUploader(client, {
pollInterval: 2000, // ポーリング間隔(ミリ秒)。デフォルト: 1000
timeout: 120000, // タイムアウト(ミリ秒)。デフォルト: 60000
});
オプションデフォルト説明
pollIntervalnumber1000ステータスポーリングの間隔(ミリ秒)
timeoutnumber60000完了待機のタイムアウト(ミリ秒)
new MediaUploader(client: Client, options?: MediaUploaderOptions)
メソッド引数戻り値説明
initiate(request)InitiatePostMediaUploadRequestPromise<UploadedMedia>アップロードを開始し mediaIduploadUrl を返す
upload(uploadUrl, data)string, ArrayBufferPromise<void>uploadUrl にメディアデータを HTTP POST で送信
waitForReady(mediaId)stringPromise<string>処理完了までポーリングして待機。完了時に mediaId を返す
  • upload() が HTTP エラーを返した場合: Error: Media upload failed ({status}): {body}
  • waitForReady() でアップロードが失敗した場合: Error: Media upload failed: {mediaId}
  • タイムアウトした場合: Error: Media upload timed out after {timeout}ms: {mediaId}
項目制限
画像最大サイズ15 MB
動画最大サイズ50 MB
対応フォーマットJPEG, PNG, GIF, MP4 など
有効期限(画像)200 秒
有効期限(動画)600 秒
アップロード容量上限1 GB / 日(アプリ単位)