LibreOffice Online + WOPI 是最开放的文档编辑解决方案之一。结合对象存储(如阿里云 OSS、S3、MinIO)后,你可以轻松打造一个支持在线编辑、预览、多用户权限控制的企业文档平台。
🏗️ 架构总览
⚙️ 第一步:OSS 对接能力设计
WOPI Host(你实现的服务)需要将这些接口背后的文件读写操作对接 OSS:
WOPI 接口 | 对应 OSS 操作 |
---|---|
CheckFileInfo | 获取文件 metadata |
GetFile | GET Object |
PutFile | PUT Object |
你可以用这些 SDK 来集成:
- 阿里云 OSS:阿里云 Python SDK
- MinIO/S3:
boto3
(Python) 或aws-sdk
(Node.js)
示例(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 上版本信息 |
📊 操作日志 | 记录用户每一次打开/编辑行为 |