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
טבלת קבצים
שדה קובץ מצורף

תצוגה מקדימה של קובץ

סקירה כללית
תצוגה מקדימה של קבצי Office
HTTP API
פיתוח הרחבות
Previous PageHTTP API
TIP

מסמך זה תורגם על ידי בינה מלאכותית. לכל אי דיוק, אנא עיין בגרסה האנגלית

#פיתוח הרחבות

#הרחבת מנועי אחסון

#צד שרת

  1. ירושה מ-StorageType

    צרו מחלקה חדשה והטמיעו את המתודות make() ו-delete(). במידת הצורך דרסו hooks כמו 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() ניתן להשתמש למילוי אוטומטי של טפסים או לאתחול רשומות ברירת מחדל.

#הרחבת סוגי קבצים בצד ה-Frontend

עבור קבצים שהועלו, ניתן להציג תצוגות מקדימות שונות בממשק לפי סוג הקובץ. לשדה הקבצים של מנהל הקבצים יש תצוגה מקדימה מובנית המבוססת דפדפן (מוטמעת ב-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 של התמונה הממוזערת ברשימת הקבצים. אם הערך מוחזר ריק, תשתמש בתמונת placeholder מובנית.

#Previewer

רכיב React לתצוגה מקדימה של קבצים.

ה-Props הנכנסים הם:

  • file: אובייקט הקובץ הנוכחי (יכול להיות URL כמחרוזת או אובייקט הכולל url/preview)
  • index: אינדקס הקובץ ברשימה
  • list: רשימת הקבצים