海魅 2017-12-18 11:10:50 24640次浏览 7条评论 4 5 0

使用Yii2 REST开发Office Online Server的使用接口WOPI

  1. WopiCheckFileInfo类

    class WopiCheckFileInfo {
     //Boolean类型 指示wopi客户端可以连接到外部的微软服务提供额外的功能。如果该值为false,则wopi客户决不允许这样的连接
     public $AllowAdditionalMicrosoftServices = false;
     //Boolean 类型,表示WOPI客户端允许连接文件中对于外部服务的引用(例如一个可以嵌入JavaSCript应用的市场),如果这个值是false,那么这个客户端则不允许建立这样的连接
     public $AllowExternalMarketplace = false;
     //没有路径的文件名。用于在用户界面(UI)中显示,并确定文件的扩展名
     public $BaseFileName;
     //String 表示WOPI客户端向用户展示WOPI服务器的品牌
     public $BreadcrumbBrandName;
     //一个指向网页的统一资源表示符(URI),当用户点击BreadcrumbBrandName展示的内容时会跳转到URI指向的地址
     public $BreadcrumbBrandUrl;
     //string 类型,表示WOPI客户端向用户展示用于表示文件的名称
     public $BreadcrumbDocName;
     //一个指向网页的URI,当用户点击BreadcrumbDocName时会跳转到URI指向的地址
     public $BreadcrumbDocUrl;
     //string 类型,表示WOPI向用户展示包含这个文件的文件夹的名称
     public $BreadcrumbFolderName;
     //一个指向网页的URI,当用户点击BreadcrumbFolderName时会跳转到URI指向的地址
     public $BreadcrumbFolderUrl;
     //一个用户可访问的URI用于通过客户端直接打开文件,它可以是一个DAV URL([RFC5232]),也可以是其他任何能够通过传递类型从而打开文件的其他URL
     public $ClientUrl;
     //Boolean 类型,表示当用户调用了关闭界面操作时,WOPI客户端将关闭浏览器窗口
     public $CloseButtonClosesWindow = false;
     //Boolean 类型,表示当用户停止渲染或者编辑客户端当前使用的文件时,向WOPI服务器发送通知
     public $ClosePostMessage = false;
     //一个指向网页的URI,表示当用户停止渲染或者编辑客户端当前使用的文件时实施者认对用户有用的网页
     public $CloseUrl;
     //Boolean 类型,表示WOPI客户端必须禁用在浏览器中缓存文件内容
     public $DisableBrowserCachingOfUserContent = false;
     //Boolean类型,表示WOPI客户端在其控制范围内必须禁用打印功能
     public $DisablePrint = false;
     //Boolean类型,表示是WOPI客户端必须禁止使用客户端公开的机器翻译功能
     public $DisableTranslation = false;
     //一个用户可访问的指向文件的URI,用户可以通过它下载一个文件的拷贝
     public $DownloadUrl;
     //一个指向网页的URI,利用WOPI客户端提供了编辑文件的体验
     public $EditAndReplyUrl;
     //Boolean类型,表示当用户尝试编辑时,WOPI客户端需要向WOPI服务器发送通知
     public $EditModePostMessage = false;
     //Boolean类型,表示当用户尝试编辑时,WOPI客户端需要向WOPI服务器发送通知
     public $EditNotificationPostMessage = false;
     //string类型,用来指定文件的扩展名,必须以“.”开头
     public $FileExtension;
     //integer 类型,表示文件名的最大长度,包括文件的拓展名,由WOPI服务器提供
     public $FileNameMaxLength = 250;
     //Boolean类型,表示当用户视图分享文件时,WOPI客户端应该通知WOPI服务器
     public $FileSharingPostMessage = false; 
     //允许用户共享文件位置的URI
     public $FileSharingUrl;
     //指向文件位置的URI,WOPI客户端使用它去获得文件,如果提供了这个地址,那么WOPI客户端必须使用它而不是使用“HTTP://server/<...>/wopi*/files/<id>/contents”
     public $FileUrl;
     //string类型,用于WOPI server唯一标识用户
     public $HostAuthenticationId;
     //一个网页的URI,利用WOPI客户端为文件提供编辑的体验
     public $HostEditUrl;
     //一个网页的URI,可以嵌入另一个HTML页面并且提供文件的编辑功能。比如该页面提供了以HTML形式插入博客的HTML代码段
     public $HostEmbeddedEditUrl;
     //一个网页的URI,可以嵌入另一个HTML页面并且提供文件的预览。比如该页面提供了以HTML形式插入博客的HTML代码段
     public $HostEmbeddedViewUrl;
     //string类型,是WOPI服务器提供的名称,用于记录日志或信息
     public $HostName; 
     //string类型,被WOPI服务器用来向WOPI客户端传递任意信息,WOPI客户端如果不能识别这个信息便有可能会忽略这个字符串。WOPI服务器不能要求WOPI客户端理解这些内容从而进行操作
     public $HostNotes;
     //是通过REST方式操作文件最基本的URI
     public $HostRestUrl;
     //一个利用WOPI客户端提供预览功能的URI
     public $HostViewUrl; 
     //string类型,WOPI客户端应该向用户展示文件的信息权限管理(IRM)策略。这个值应该与IrmPolicyTitle相结合
     public $IrmPolicyDescription;
     //string类型,WOPI客户端应该向用户展示文件的信息权限管理(IRM)策略。这个值应该与IrmPolicyDescription相结合
     public $IrmPolicyTitle;
     //Boolean类型,用于确认用户在编辑文档之前有正确的许可
     public $LicenseCheckForEditIsEnabled = false;
     //string类型,用于唯一标识文件的所有者
     public $OwnerId;
     //string类型,WOPI客户端发送[W3C-HTML5WEBMSG]所描述的信息时,一定要使用类似targetOrigin 的参数
     public $PostMessageOrigin;
     //string类型,识别WOPI客户端可用于发现关于用户的在线状态的信息,比如通过即时的信息判断用户是否在线。WOPI客户端需要知道特定存在的提供者才能够利用这个值
     public $PresenceProvider;  
     //string类型,识别在PresenceProvider上下文中的用户
     public $PresenceUserId;
     //一个网页的URI,用于解释WOPI服务器的隐私策略
     public $PrivacyUrl;
     //Boolean类型,表示WOPI客户端需要对文件的拷贝和打印采取预防措施,它在WOPI客户端中帮助执行IRM
     public $ProtectInClient = false;
     //提示用户这个文件无法被修改
     public $ReadOnly = false;
     //Boolean类型,表示WOPI客户端一定不允许用户下载文件或者使用单独应用程序打开文件
     public $RestrictedWebViewOnly = false; 
     //它一定是实时且非空的,是256bit的SHA-2-encoded [FIPS180-2] 对于文件内容的散列
     public $SHA256;
     //一个URI用于将当前用户登入WOPI服务器所支持的认证系统
     public $SignInUrl;
     //一个URI用于将当前用户登出WOPI服务器所支持的认证系统
     public $SignoutUrl;
     //以字节表示的文件的大小
     public $Size;
     //Array类型,表示wopi服务器支持的共享URL类型
     public $SupportedShareUrlTypes = [];
     //Boolean类型,表示WOPI服务器支持多个用户同时对文件进行修改
     public $SupportsCoauth = false;
     //Boolean类型,表示WOPI服务器支持ExecuteCellStorageRequest 和ExcecuteCellStorageRelativeRequest 的操作
     public $SupportsCobalt = false;
     //Boolean类型,表示WOPI服务支持锁定长度为1024个ASCII字符的ID
     public $SupportsExtendedLockLength = false;
     //Boolean类型,表示WOPI服务器支持使用WOPI客户端创建新文件
     public $SupportsFileCreation = false;
     //Boolean 类型,表示WOPI服务器支持对于文件的EnumerateChildren和DeleteFile 操作
     public $SupportsFolders = false;
     //Boolean类型,表示WOPI服务器提供了GetLock
     public $SupportsGetLock = false;
     //Boolean类型,表示WOPI服务器支持对于文件Lock 、Unlock 、RefreshLock 和UnlockAndRelock 操作
     public $SupportsLocks = false;
     //Boolean类型,表示WOPI服务器提供了RenameFile
     public $SupportsRename = false;
     //Boolean类型,表示WOPI服务器支持用户可以通过有限的方式对受限制的URL进行操作的场景
     public $SupportsScenarioLinks = false;
     //Boolean类型,表示WOPI服务使用存储在文件中的凭证来调用安全数据存储
     public $SupportsSecureStore = false;
     //Boolean类型,表示WOPI服务器支持对于文件的PutFile 和PutRelativeFile 操作
     public $SupportsUpdate = false;
     //Boolean类型,表示WOPI服务器提供了PutUserInfo
     public $SupportsUserInfo = false;
     //string类型,用于WOPI服务器唯一表示tenant
     public $TenantId;
     //一个网页URI,用于解释WOPI服务器的使用条款政策
     public $TermsOfUseUrl;
     //string类型,用于以WOPI服务器选择的格式将时间区域信息传递给WOPI客户端
     public $TimeZone;
     //string类型,用于唯一表示文件内容。当文件内容变化时这个值一定要变化。这个值也应与有相同内容的文件相同
     public $UniqueContentId;
     //Boolean类型,表示用户有权限查看这个文件的广播。广播是一个文件的活动,涉及控制一组参加者的文件的视图的一个或多个呈现者。比如一个传播者能够通过广播将幻灯片广播给多个接受者
     public $UserCanAttend = false;
     //Boolean类型,表示用户没有足够的权限在WOPI服务器上新建文件
     public $UserCanNotWriteRelative = false;
     //Boolean类型,表示用户有权限广播这个文件给那些有权限浏览文件的人。广播是一个文件的活动,涉及控制一组参加者的文件的视图的一个或多个呈现者。比如一个传播者能够通过广播将幻灯片广播给多个接受者
     public $UserCanPresent = false;
     //Boolean类型,表示用户有权限重命名文件
     public $UserCanRename = false;
     //Boolean类型,表示用户有权限改变文件
     public $UserCanWrite = false;
     //string类型,是用户的名称,如果被锁定,WOPI客户端在某些场景可能会配置一个替代的字符串,或者展示没有名称
     public $UserFriendlyName;
     //string类型,用于WOPI服务器唯一标识用户
     public $UserId;
     //string类型,WOPI客户端应该校验用户的许可状态。如果WOPI客户端没有识别内容有可能忽略这个字符串
     public $UserInfo;
     //string类型,代表基于WOPI服务器的版本模式,文件的当前版本。当文件改变时,这个值一定要改变,同时对于一个给定的文件,版本的值应该从不重复
     public $Version;
     //Boolean类型,表示WOPI客户端不应该允许用户使用WOPI客户端的编辑功能去操作文件,但这不意味着用户没有编辑文件的权限
     public $WebEditingDisabled = false;
     //Array类型,表示可用于文件的工作流类型的字符串的数组
     public $WorkflowType = [];
     //String类型,根据wopi服务器的文件版本的架构文件的当前版本。当文件内容发生更改时,该值必须更改,并且版本值必须从不为给定文件重复
     public $WorkflowUrl;
    }
    
  2. FileController接口

class FileController extends ActiveController {
public $modelClass = '';

/**
 * 获取文件信息
 * @param $id
 * @return WopiCheckFileInfo|string
 */
public function actionGetfileinfo($id)
{
    $model = Doucment::findOne((int)$id);
    $data = explode('/', $model->url);
    $filename = end($data);
    $path = $_SERVER["DOCUMENT_ROOT"] . $model->url;
    if (file_exists($path)) {
        $handle = fopen($path, "r");
        $size = filesize($path);
        $contents = fread($handle, $size);
        $SHA256 = base64_encode(hash('sha256', $contents, true));
        $json = new WopiCheckFileInfo();
        $json->BaseFileName = $filename;
        $json->BreadcrumbDocName = $model->title;
        $json->DisableBrowserCachingOfUserContent = false;
        $json->DisablePrint = false;
        $json->DisableTranslation = false;
        $json->OwnerId = $model->author;
        $json->SHA256 = $SHA256;
        $json->Size = $size;
        $json->SupportsFolders = true;
        $json->SupportsLocks = true;
        $json->SupportsUpdate = true;
        $json->UserFriendlyName = $model->author;
        $json->Version = (string)time();
        $json->UserCanWrite = true;
        $json->WebEditingDisabled = false;
        return $json;
    } else {
        return '文件未找到';
    }
}

/**
 * 获取文件内容
 * @param $id
 */
public function actionGetfile($id)
{
    $model = Document::findOne((int)$id);
    $path = $_SERVER["DOCUMENT_ROOT"] . $model->url;
    if (file_exists($path)) {
        $handle = fopen($path, "r");
        $contents = fread($handle, filesize($path));
        header("Content-type:application/octet-stream");
        echo $contents;
    }
}

/**
 * 保存编辑
 * @param $id
 */
public function actionPutfile($id)
{
    $model = Document::findOne((int)$id);
    $path = $_SERVER["DOCUMENT_ROOT"] . $model->url;
    $contents = file_get_contents('php://input');
    if (file_exists($path)) {
        file_put_contents($path, $contents);
    }
    echo $contents;
}
}

OOS编辑界面_LI.jpg

以上是个人写的一个简单的Office Online Server(OOS) Wopi接口,该接口目前能在线预览所有word、excel、PowerPoint文档,在线编辑功能只支持docx,xlsx,pptx文档。
其它OOS的功能实现有待大家一起分享。
本人第一次发教程,有不足之处还望大家多多包涵!

觉得很赞
  • 评论于 2018-03-13 15:38 举报

    嗨,你安装的office web app server是哪个版本的啊?文档在线编辑功能正常吗?
    能分享下安装包吗

    2 条回复
    评论于 2018-03-29 17:31 回复

    我使用的是office online server 2017,可以正常进行文档在线编辑

    评论于 2019-05-24 17:33 回复

    能给个下载地址吗

  • 评论于 2018-05-09 16:59 举报

    您好,我按照官方文档安装部署好office online server后,使用WOPI协议调用we/wordeditorframe.aspx编辑页面是可以的,但是调用预览页面wv/wordviewerframe.aspx,[wv/ResReader.ashx]页面报404错误,Excel预览和编辑都可以,唯独word的预览页面不行,请问您遇到过这种问题吗?

  • 评论于 2019-03-29 14:31 举报

    编辑的时候老是抱歉,无法打开此文档进行编辑

    1 条回复
    评论于 2019-04-26 09:06 回复

    只可以编辑docx,xlsx,pptx文件

  • 评论于 2019-03-29 14:34 举报

    12345

  • 评论于 2019-06-14 22:16 举报

    您好,我想问下你word文档能实现多人编辑吗?

    1 条回复
    评论于 2019-06-17 09:23 回复

    据说是可以的,你可以试着自己实现一下,我没实现过。

  • 评论于 2020-09-07 16:26 举报

    好使好使好使好使好使好使好使好使

  • 评论于 2020-09-07 16:26 举报

    好使好使好使好使好使好使好使好使

您需要登录后才可以评论。登录 | 立即注册