使用 OSS 存储集成 LibreOffice Online:预览 + 编辑实战

LibreOffice Online + WOPI 是最开放的文档编辑解决方案之一。结合对象存储(如阿里云 OSS、S3、MinIO)后,你可以轻松打造一个支持在线编辑、预览、多用户权限控制的企业文档平台。


在这里插入图片描述

🏗️ 架构总览

iframe加载编辑器
请求 WOPI 接口
通过 SDK 访问
返回文件内容和元数据
前端浏览器
LibreOffice Online
WOPI Host 服务
OSS/MinIO/S3

⚙️ 第一步:OSS 对接能力设计

WOPI Host(你实现的服务)需要将这些接口背后的文件读写操作对接 OSS:

WOPI 接口对应 OSS 操作
CheckFileInfo获取文件 metadata
GetFileGET Object
PutFilePUT Object

你可以用这些 SDK 来集成:

示例(Python + 阿里云 OSS):

import oss2

auth = oss2.Auth('<AccessKeyId>', '<AccessKeySecret>')
bucket = oss2.Bucket(auth, 'https://<endpoint>', '<bucket-name>')

def get_file_stream(file_path):
    return bucket.get_object(file_path)

def save_file(file_path, data):
    bucket.put_object(file_path, data)

def get_file_info(file_path):
    meta = bucket.get_object_meta(file_path)
    return {
        'Size': meta.content_length,
        'LastModified': meta.last_modified
    }

🧩 第二步:WOPI Host 对接 OSS 的完整接口实现

✔️ CheckFileInfo 示例:

@app.route('/wopi/files/<path:filename>', methods=['GET'])
def check_file_info(filename):
    try:
        info = get_file_info(filename)
        return jsonify({
            "BaseFileName": filename,
            "Size": info['Size'],
            "OwnerId": "user1",
            "UserId": "user1",
            "UserCanWrite": True,
            "ReadOnly": False
        })
    except Exception:
        return jsonify({"error": "File not found"}), 404

✔️ GetFile(下载)

@app.route('/wopi/files/<path:filename>/contents', methods=['GET'])
def get_file(filename):
    stream = get_file_stream(filename)
    return Response(stream.read(), mimetype='application/octet-stream')

✔️ PutFile(保存)

@app.route('/wopi/files/<path:filename>/contents', methods=['POST', 'PUT'])
def put_file(filename):
    save_file(filename, request.data)
    return '', 200

🌐 第三步:编辑器嵌入 + 文件 URL 构造

iframe 示例:

<iframe src="https://libreoffice.domain.com/loleaflet/dist/loleaflet.html?WOPISrc=https://your-wopi-host.com/wopi/files/report.docx&access_token=xxx" width="100%" height="100%"></iframe>

说明:

  • WOPISrc:指向你自己的 WOPI Host 接口
  • access_token:建议为 JWT,带有 OSS 文件路径和用户权限

🔐 第四步:文件访问权限控制

使用 JWT(或其他方式)来控制用户访问 OSS 的具体文件路径。

{
  "file": "user123/reports/test.docx",
  "user": "user123",
  "canWrite": true,
  "exp": 1719999999
}

WOPI Host 解析 JWT,确认访问合法性后再调用 OSS 进行实际操作。


💡 第五步:预览模式与编辑模式区分

WOPI 协议中的参数支持只读设置:

{
  "ReadOnly": true,
  "UserCanWrite": false
}

配合 JWT 控制访问行为,实现用户 A 可编辑,用户 B 仅预览等权限粒度。


🧪 第六步:本地开发用 MinIO 替代 OSS

# docker-compose.yml
services:
  minio:
    image: minio/minio
    command: server /data
    ports:
      - "9000:9000"
    environment:
      MINIO_ACCESS_KEY: minioadmin
      MINIO_SECRET_KEY: minioadmin
    volumes:
      - ./data:/data

使用 MinIO 控制台 管理文档上传测试。


实用小工具

App Store 截图生成器应用图标生成器在线图片压缩Chrome插件-强制开启复制-护眼模式-网页乱码设置编码
乖猫记账,AI智能分类的聊天记账。


📦 可选:扩展功能建议

功能模块说明
🔍 文件索引接入 ElasticSearch、实现内容全文搜索
🔐 文件加密在 OSS 上传前加密本地缓存,增加安全性
🧾 文件历史版本在每次 PutFile 时记录 OSS 上版本信息
📊 操作日志记录用户每一次打开/编辑行为
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@井九

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值