php实现wopi
PHP实现WOPI集成
WOPI(Web Application Open Platform Interface)是一种协议,允许Web应用程序(如Office Online Server)与存储服务(如SharePoint或OneDrive)进行交互。以下是PHP实现WOPI集成的关键步骤。
配置WOPI发现端点
WOPI客户端(如Office Online Server)通过发现端点获取支持的应用程序和操作。创建一个XML文件描述支持的WOPI操作。
// discovery.xml 示例
<?xml xmlns="http://schemas.microsoft.com/wopi/2016/05/discovery">
<net-zone name="internal-http">
<app name="Word" favIconUrl="...">
<action name="view" ext="docx" urlsrc="http://your-server/wopi/files/{file_id}" />
<action name="edit" ext="docx" urlsrc="http://your-server/wopi/files/{file_id}" />
</app>
</net-zone>
</xml>
实现WOPI REST端点
WOPI核心接口包括CheckFileInfo和GetFile操作。需要创建PHP路由处理这些请求。
// 处理CheckFileInfo请求
$router->get('/wopi/files/{fileId}', function($request, $response, $args) {
$fileInfo = [
'BaseFileName' => 'document.docx',
'Size' => filesize($filePath),
'OwnerId' => 'user123',
'UserId' => 'user123',
'UserFriendlyName' => 'John Doe',
'UserCanWrite' => true,
'SupportsUpdate' => true
];
return $response->withJson($fileInfo);
});
// 处理GetFile请求
$router->get('/wopi/files/{fileId}/contents', function($request, $response, $args) {
$filePath = '/path/to/files/' . $args['fileId'];
return $response->withFile($filePath);
});
处理文件锁定和更新
WOPI支持文件锁定机制防止冲突编辑。需要实现Lock、Unlock和RefreshLock操作。
// 处理Lock请求
$router->post('/wopi/files/{fileId}', function($request, $response, $args) {
$lockId = $request->getHeader('X-WOPI-Lock')[0];
// 存储锁ID到数据库或缓存
return $response->withStatus(200);
});
实现POST消息通信
Office Online使用postMessage与主机页面通信。需要在HTML页面中添加JavaScript处理消息。
window.addEventListener('message', function(event) {
if (event.origin !== 'https://officeonline.yourdomain.com') return;
switch (event.data.action) {
case 'Close':
// 处理文档关闭
break;
case 'Save':
// 处理保存请求
break;
}
});
安全考虑
WOPI集成需要严格的安全措施:
- 实现HTTPS所有端点
- 验证X-WOPI-Proof和X-WOPI-ProofOld头
- 使用访问令牌验证请求
- 限制访问令牌有效期
// 验证访问令牌示例
function validateAccessToken($token) {
// 验证令牌是否有效且未过期
return $isValid;
}
测试和验证
使用Office Online测试工具验证WOPI集成:
- 检查发现端点是否正确配置
- 验证文件打开和编辑功能
- 测试并发编辑场景
- 验证文件保存和关闭操作
以上步骤提供了PHP实现WOPI集成的基本框架。具体实现需要根据实际存储系统和业务需求进行调整。







