logologo
スタート
マニュアル
開発
プラグイン
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
スタート
マニュアル
開発
プラグイン
API
logologo
ファイルマネージャー
概要

ストレージエンジン

概要
ローカルストレージ
AWS S3
Alibaba Cloud OSS
Tencent Cloud COS
S3 Pro
ファイルテーブル
添付フィールド
拡張開発
Previous Page添付フィールド
TIP

このドキュメントはAIによって翻訳されました。不正確な情報については、英語版をご参照ください

#拡張開発

#ストレージエンジンの拡張

#サーバーサイド

  1. StorageType の継承

    新しいクラスを作成し、make() と delete() を実装します。必要に応じて getFileURL()、getFileStream()、getFileData() などのフックをオーバーライドしてください。

例:

// packages/my-plugin/src/server/storages/custom.ts
import { AttachmentModel, StorageModel, StorageType } from '@nocobase/plugin-file-manager';
import type { StorageEngine } from 'multer';
import multer from 'multer';
import path from 'path';
import fs from 'fs/promises';

export class CustomStorageType extends StorageType {
  make(): StorageEngine {
    return multer.diskStorage({
      destination: path.resolve('custom-uploads'),
      filename: (req, file, cb) => {
        cb(null, `${Date.now()}-${file.originalname}`);
      },
    });
  }

  async delete(records: AttachmentModel[]) {
    let deleted = 0;
    const failures: AttachmentModel[] = [];
    for (const record of records) {
      try {
        await fs.unlink(path.resolve('custom-uploads', record.path || '', record.filename));
        deleted += 1;
      } catch (error) {
        failures.push(record);
      }
    }
    return [deleted, failures];
  }
}
  1. 新しいタイプを登録
    プラグインの beforeLoad または load ライフサイクルに新しいストレージ実装を注入します:
// packages/my-plugin/src/server/plugin.ts
import { Plugin } from '@nocobase/server';
import PluginFileManagerServer from '@nocobase/plugin-file-manager';
import { CustomStorageType } from './storages/custom';

export default class MyStoragePluginServer extends Plugin {
  async load() {
    const fileManager = this.app.pm.get(PluginFileManagerServer);
    fileManager.registerStorageType('custom-storage', CustomStorageType);
  }
}

登録後、ストレージ設定は組み込みタイプと同様に storages リソースに表示されます。StorageType.defaults() が提供する設定は、フォームの自動入力やデフォルトレコードの初期化に利用できます。

#フロントエンドのファイルタイプ拡張

アップロード済みのファイルについて、フロントエンドの画面でファイルタイプに応じた異なるプレビュー内容を表示できます。ファイルマネージャーの添付フィールドには、ブラウザ(iframe 内)でのファイルプレビューが組み込まれており、画像・動画・音声・PDF などの多くの形式をブラウザで直接プレビューできます。ブラウザが対応しない形式や特別なプレビュー操作が必要な場合は、ファイルタイプに基づくプレビューコンポーネントを拡張できます。

#例

たとえば Office ファイルに対してカスタムのオンラインプレビューを統合したい場合、次のコードを使用できます:

import React, { useMemo } from 'react';
import { Plugin, matchMimetype } from '@nocobase/client';
import { filePreviewTypes } from '@nocobase/plugin-file-manager/client';

class MyPlugin extends Plugin {
  load() {
    filePreviewTypes.add({
      match(file) {
        return matchMimetype(file, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');
      },
      Previewer({ file }) {
        const url = useMemo(() => {
          const src =
            file.url.startsWith('https://') || file.url.startsWith('http://')
              ? file.url
              : `${location.origin}/${file.url.replace(/^\//, '')}`;
          const u = new URL('https://view.officeapps.live.com/op/embed.aspx');
          u.searchParams.set('src', src);
          return u.href;
        }, [file.url]);
        return <iframe src={url} width="100%" height="600px" style={{ border: 'none' }} />;
      },
    });
  }
}

ここで filePreviewTypes は @nocobase/plugin-file-manager/client が提供するファイルプレビュー拡張のための入口オブジェクトです。add メソッドでファイルタイプの記述オブジェクトを追加します。

各ファイルタイプは match() メソッドを実装し、要件に合致するかを判定します。例では matchMimetype を使ってファイルの mimetype を確認し、docx に一致すれば処理対象とします。一致しない場合は組み込みのタイプ処理にフォールバックします。

タイプ記述オブジェクトの Previewer プロパティがプレビュー用コンポーネントです。ファイルタイプが一致すると、このコンポーネントがプレビューダイアログに描画されます。任意の React ビュー(iframe、プレイヤー、チャートなど)を返せます。

#API

export interface FilePreviewerProps {
  file: any;
  index: number;
  list: any[];
}

export interface FilePreviewType {
  match(file: any): boolean;
  getThumbnailURL?: (file: any) => string | null;
  Previewer?: React.ComponentType<FilePreviewerProps>;
}

export class FilePreviewTypes {
  add(type: FilePreviewType): void;
}

#filePreviewTypes

filePreviewTypes は @nocobase/plugin-file-manager/client からインポートするグローバルインスタンスです:

import { filePreviewTypes } from '@nocobase/plugin-file-manager/client';

#filePreviewTypes.add()

ファイルタイプの登録センターに新しい記述オブジェクトを登録します。記述オブジェクトの型は FilePreviewType です。

#FilePreviewType

#match()

ファイル形式のマッチング方法。

入力パラメータ file はアップロード済みファイルのデータオブジェクトで、タイプ判定に使える属性を含みます:

  • mimetype:mimetype の説明
  • extname:拡張子("." を含む)
  • path:ファイルの相対保存パス
  • url:ファイル URL

戻り値は boolean で、マッチするかどうかを示します。

#getThumbnailURL

ファイル一覧で使うサムネイル URL を返します。返り値が空の場合は内蔵のプレースホルダー画像が使われます。

#Previewer

ファイルをプレビューするための React コンポーネント。

受け取る Props は以下です:

  • file:現在のファイルオブジェクト(文字列 URL または url/preview を含むオブジェクト)
  • index:一覧内のファイルのインデックス
  • list:ファイル一覧