You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Remirror编辑器ImageExtension的uploadHandler使用示例

使用Remirror的ImageExtension实现拖拽图片上传示例

核心实现步骤

不需要纠结未导出的类型,直接通过类型推断或手动定义uploadHandler结构即可,以下是完整可运行示例:

1. 安装必要依赖

确保已安装Remirror核心及相关扩展:

npm install remirror @remirror/react @remirror/extension-image

2. 完整组件代码

import { useEditor, Remirror, EditorComponent } from '@remirror/react';
import { ImageExtension } from '@remirror/extension-image';

const ImageUploadEditor = () => {
  // 自定义上传处理函数,替换为你的实际上传逻辑
  const customUploadHandler = async (file: File) => {
    const formData = new FormData();
    formData.append('image', file);

    try {
      const response = await fetch('/api/upload-image', {
        method: 'POST',
        body: formData,
      });

      if (!response.ok) {
        throw new Error('上传失败');
      }

      const data = await response.json();
      // 返回图片的在线访问地址
      return { src: data.imageUrl };
    } catch (error) {
      console.error('上传出错:', error);
      // 上传失败返回占位图,或抛出错误让编辑器显示默认错误状态
      return { src: 'https://via.placeholder.com/150?text=上传失败' };
    }
  };

  const extensions = () => [
    new ImageExtension({
      uploadHandler: customUploadHandler,
      // 显式开启拖拽上传(默认已开启)
      enableDrop: true,
      // 可选:开启粘贴上传
      enablePaste: true,
    }),
  ];

  const { manager } = useEditor({ extensions });

  return (
    <Remirror manager={manager}>
      <EditorComponent />
    </Remirror>
  );
};

export default ImageUploadEditor;

3. 关键说明

  • uploadHandler规则:接收File对象,异步处理后返回包含src字段的对象,该字段即为图片上传后的在线地址。
  • TypeScript类型兼容:如果使用TS,可手动定义类型规避未导出问题:
type UploadHandler = (file: File) => Promise<{ src: string }>;

直接给customUploadHandler添加该类型即可。

  • 错误处理:上传失败时,可返回占位图URL或直接抛出错误,编辑器会自动处理错误状态。

4. 后端接口示例(可选)

配合前端的Node.js/Express简单示例:

const express = require('express');
const multer = require('multer');
const app = express();
const upload = multer({ dest: 'uploads/' });

app.post('/api/upload-image', upload.single('image'), (req, res) => {
  // 生产环境建议替换为云存储(如OSS、S3)地址
  const imageUrl = `http://localhost:3000/uploads/${req.file.filename}`;
  res.json({ imageUrl });
});

app.listen(3000, () => console.log('服务器运行在3000端口'));

内容的提问来源于stack exchange,提问作者Siddhartha Chowdhury

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:46:03