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

PHP WOPI Host与Client通信疑问:如何设置客户端WOPI URL?

关于WOPI Client中$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)。

另外还有几个关键注意点:

  1. 信任关系配置:必须在WOPI服务(比如OOS)中配置信任你的WOPI Host域名,否则WOPI服务会拒绝调用你的Host接口,导致文档无法加载。
  2. access_token验证:你目前的Host代码还没做token验证,建议后续加上——比如检查请求头里的X-WOPI-AccessToken是否和你生成的access_token匹配,否则WOPI服务调用接口时会被拒绝。
  3. Client代码小修复:你的PHP代码输出$wopi_url和$access_token时少了echo,应该改成:
    action='<?php echo $wopi_url; ?>'
    
    和
    value='<?php echo $access_token; ?>'
    
    不然表单的action和输入框值是空的,会导致提交失败。

最后,如果你还没部署WOPI服务,建议先搭建Office Online Server或使用微软提供的测试环境(注意测试环境有使用限制),再进行后续测试。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:59:05