跳到主要内容

后端:@blocklet/uploader-server

@blocklet/uploader-server 包提供了一套 Express.js 中间件,旨在处理 blocklet 后端的各种文件处理任务。它作为 @blocklet/uploader 前端组件的服务器端对应部分,支持直接文件上传、与远程源集成以及资源服务等功能。

虽然它被设计为与其前端伙伴无缝协作,但也可以用作自定义文件上传逻辑的独立解决方案。该包导出了几个模块化的中间件初始化器,您可以轻松地将它们集成到您的 Express 应用程序中。

核心中间件交互

下图说明了在上传过程中,主要中间件组件如何与前端和外部服务进行交互。

安装

首先,将该包添加到您的 blocklet 的依赖项中。

Installation

bash
pnpm add @blocklet/uploader-server

通用用法

这是一个将上传和伴侣中间件集成到您的 Express 应用程序路由中的典型示例。您可以初始化所需的中间件,然后将其处理程序挂载到特定路由上。

Express Router Example

javascript
import { initLocalStorageServer, initCompanion } from '@blocklet/uploader-server';
import express from 'express';

// 假设 `env`、`user`、`auth`、`ensureComponentDid` 和 `Upload` 模型已在别处定义
const router = express.Router();

// 1. 初始化本地存储服务器以进行直接上传
const localStorageServer = initLocalStorageServer({
  path: env.uploadDir, // 用于保存上传文件的目录
  express,
  // 可选:文件成功上传后执行的回调函数
  onUploadFinish: async (req, res, uploadMetadata) => {
    const {
      id: filename,
      size,
      metadata: { filename: originalname, filetype: mimetype },
    } = uploadMetadata;

    // 为上传的文件构造公共 URL
    const obj = new URL(env.appUrl);
    obj.protocol = req.get('x-forwarded-proto') || req.protocol;
    obj.pathname = `/uploads/${filename}`;

    // 将文件元数据保存到数据库
    const doc = await Upload.insert({
      mimetype,
      originalname,
      filename,
      size,
      // ... 来自请求的其他元数据
    });

    // 向前端返回一个 JSON 响应
    const resData = { url: obj.href, ...doc };
    return resData;
  },
});

// 将上传处理程序挂载到特定路由上
router.use('/uploads', user, auth, ensureComponentDid, localStorageServer.handle);

// 2. 初始化 Companion 以支持远程源(例如 URL、Unsplash)
const companion = initCompanion({
  path: env.uploadDir,
  express,
  providerOptions: env.providerOptions, // 您的提供商密钥(例如 Unsplash)
  uploadUrls: [env.appUrl], // 您的应用的 URL
});

// 将伴侣处理程序挂载到其路由上
router.use('/companion', user, auth, ensureComponentDid, companion.handle);

可用中间件

该包为不同的功能导出了几个中间件初始化器。点击卡片可查看其详细的 API 参考和配置选项。

后续步骤

@blocklet/uploader-server 包为您的 blocklet 中强大的文件处理系统提供了必要的服务器端构建块。通过组合这些中间件功能,您可以为用户创建功能丰富的上传体验。

要开始使用,我们建议您查阅 initLocalStorageServer 文档,以设置核心的直接上传功能。