PHP WOPI Host与Client通信疑问:如何设置客户端WOPI URL?
$wopi_url的设置困惑 我正在尝试搭建一个基础的WOPI测试示例,已经写了PHP版的WOPI Host代码(实现了两个接口)和基础的WOPI Client代码,但不清楚Client里的$wopi_url应该填什么值。
我的Host代码实现了:
/files/:name对应getFileInfoAction(用来返回文件元信息,对应WOPI的CheckFileInfo接口)/files/:name/contents对应getFileAction(用来返回文件内容,对应WOPI的GetFile接口)
WOPI Host代码
<?php require 'vendor/autoload.php'; use Pux\Mux; use Pux\Executor; class FilesController { // route: /files/:name public function getFileInfoAction($name) { $path = "office/$name"; if (file_exists($path)) { $handle = fopen($path, "r"); $size = filesize($path); $contents = fread($handle, $size); $SHA256 = base64_encode(hash('sha256', $contents, true)); $json = array( 'BaseFileName' => $name, 'OwnerId' => 'admin', 'Size' => $size, 'SHA256' => $SHA256, 'Version' => '222888822' ); echo json_encode($json); } else { echo json_encode(array()); } } // route: /files/:name/contents public function getFileAction($name) { $path = "office/$name"; if (file_exists($path)) { $handle = fopen($path, "r"); $contents = fread($handle, filesize($path)); header("Content-type: application/octet-stream"); echo $contents; } } } $mux = new Mux; $mux->get('/files/:name', ['FilesController','getFileInfoAction']); $mux->get('/files/:name/contents', ['FilesController','getFileAction']); $path = $_SERVER['PATH_INFO']; $args = explode("&", $path); $route = $mux->dispatch( $args[0] ); Executor::execute($route);
WOPI Client代码
<?php $wopi_url= ''; // ?????? $access_token = 'xxx'; $access_token_ttl = 1000 * 60; ?> <form id="office_form" name="office_form" target="office_frame" action='<?php $wopi_url; ?>' method="post"> <input name="access_token" value='<?php $access_token; ?>' type="hidden" /> <input name="access_token_ttl" value='<?php $access_token_ttl; ?>' type="hidden" /> </form> <span id="frameholder"></span> <script type="text/javascript"> var frameholder = document.getElementById("frameholder"); var office_frame = document.createElement("iframe"); office_frame.name = "office_frame"; office_frame.id ="office_frame"; frameholder.appendChild(office_frame); document.getElementById("office_form").submit(); </script>
请问正确的$wopi_url应该怎么设置?
先纠正一个小细节:你在描述里把接口对应关系搞反了——你的getFileInfoAction对应/files/:name,这才是WOPI规范里的CheckFileInfo接口(返回文件元数据);而getFileAction对应/files/:name/contents,这是GetFile接口(返回文件内容),你的代码路由是对的,只是描述混淆了,这点要注意避免后续排查问题时出错。
接下来重点说$wopi_url的设置:
$wopi_url不是指向你自己的WOPI Host接口,而是指向你使用的WOPI服务(比如Office Online Server,或其他兼容WOPI的在线文档服务)的文档操作入口URL。WOPI服务会通过这个入口,用你传递的access_token去调用你的WOPI Host接口获取文件信息和内容,最终在iframe里渲染文档。
举个实际例子,如果你用的是Office Online Server(OOS),$wopi_url的格式取决于你要实现查看还是编辑:
- 查看文档:
https://<你的OOS服务器域名>/wopi/files/<你的文件名>/view - 编辑文档:
https://<你的OOS服务器域名>/wopi/files/<你的文件名>/edit
这里的<你的文件名>就是你Host里:name参数对应的文件名(比如test.docx),<你的OOS服务器域名>是你部署的Office Online Server地址(比如oos.example.com)。
另外还有几个关键注意点:
- 信任关系配置:必须在WOPI服务(比如OOS)中配置信任你的WOPI Host域名,否则WOPI服务会拒绝调用你的Host接口,导致文档无法加载。
- access_token验证:你目前的Host代码还没做token验证,建议后续加上——比如检查请求头里的
X-WOPI-AccessToken是否和你生成的access_token匹配,否则WOPI服务调用接口时会被拒绝。 - Client代码小修复:你的PHP代码输出
$wopi_url和$access_token时少了echo,应该改成:
和action='<?php echo $wopi_url; ?>'
不然表单的action和输入框值是空的,会导致提交失败。value='<?php echo $access_token; ?>'
最后,如果你还没部署WOPI服务,建议先搭建Office Online Server或使用微软提供的测试环境(注意测试环境有使用限制),再进行后续测试。
内容的提问来源于stack exchange,提问作者ar099968

