zoukankan      html  css  js  c++  java
  • .Net Core集成Office Web Apps(一)

      最近开始学习.Net Core,并使用Visual Studio Code工具来开发。感觉开发起来特别的方便,但是有个头疼的地方:许多的类库被修改了,一时半会儿还熟悉不了,需要查阅官方API。。。

      Microsoft Office Web Apps(以下简称OWA)是由微软推出的基于Web端的在线办公工具,它将Microsoft Office产品的体验延伸到可支持的浏览器上。OWA让你可以在任何地方共享自己的Office文档。

      系统集成OWA需要参考官方的系统接口定义(https://wopi.readthedocs.io/en/latest/),这个接口简称WOPI(Web Application Open Platform Interface)。

    下面介绍一个完整的OWA的例子,最终效果如图:

    wopi协议的工作流程如下图

      我们所要做的就是开发一个OWA客户端,提供文件信息及文件流给OWA服务器,当然也接收从OWA服务POST来的文件流来保存文件,出于安全考虑也可以加上access_token进行自定义权限验证。

      标准的WOPI服务包括:CheckFileInfo、GetFile、Lock、GetLock、RefreshLock、Unlock、UnlockAndRelock、PutFile、PutRelativeFile、RenameFile、DeleteFile、PutUserInfo等

    返回状态码定义:

    200 OK 成功

    400 Bad Request 错误请求

    401 Unauthorized 非法 与access_token相关

    409 Conflict 冲突 目标文件已经存在或LOCK

    413 Request Entity Too Large 文件太大

    500 Internal Server Error 内部服务器错误

    501 Not Implemented 不支持,如果CheckFileInfo的SupportsUpdate和UserCanNotWriteRelative都设置为true,则必须返回501

    OwaFileInfo类

    需要定义一个文件信息类,该类的主要属性包括:

    属性名

    类型

    描述

    BaseFileName

    String

    包含扩展的文件名

    BreadcrumbFolderName

    String

    文件夹名称(界面显示)

    BreadcrumbDocName

    String

    文档名称(界面显示)

    OwnerId

    String

    唯一标识文件所有者

    Size

    Long

    文件大小

    SHA256

    String

    SHA-2 256位散列编码值

    Version

    String

    版本编号

    SupportsUpdate

    Bool

    是否支持PUT文件

    UserCanWrite

    Bool

    是否有权限修改

    SupportsLocks

    Bool

    是否支持Lock和Unlock

    CloseButtonClosesWindow

    Bool

    是否显示关闭按钮

    更多属性参考API   https://wopirest.readthedocs.io/en/latest/files/CheckFileInfo.html

    属性名必须与API中一致才能被OWA服务器识别。

    using System;
    using System.Runtime.Serialization;
    
    namespace WebApplication.Models.FileInfoModels
    {
        [DataContract(Name = "OwaFileInfo")]
        public class OwaFileInfo
        {
            public OwaFileInfo()
            {
                this.SupportsUpdate = false;
                this.UserCanWrite = false;
                this.SupportsLocks = false;
            }
    
            [DataMember(Name = "BaseFileName")]
            public string BaseFileName { get; set; }
            [DataMember(Name = "OwnerId")]
            public string OwnerId { get; set; }
            [DataMember(Name = "Size")]
            public long Size { get; set; }
            [DataMember(Name = "SHA256")]
            public string SHA256 { get; set; }
            [DataMember(Name = "Version")]
            public string Version { get; set; }
            [DataMember(Name = "SupportsUpdate")]
            public bool SupportsUpdate { get; set; }
            [DataMember(Name = "UserCanWrite")]
            public bool UserCanWrite { get; set; }
            [DataMember(Name = "SupportsLocks")]
            public bool SupportsLocks { get; set; }
            [DataMember(Name = "BreadcrumbDocName")]
            public string BreadcrumbDocName { get; set; }
            [DataMember(Name = "CloseButtonClosesWindow")]
            public bool CloseButtonClosesWindow { get; set; }
            [DataMember(Name = "BreadcrumbFolderName")]
            public string BreadcrumbFolderName { get; set; }
        }
    }
    OwaFileInfo

    CheckFileInfo服务

    接口要求实现CheckFileInfo服务,作用是OWA服务器需要获取文件的详细信息和操作权限(如:是否可编辑),以确保文件的真实有效。这些信息已经在上面的类中进行了定义。

    Method:GET

    URI:HTTP://server/<...>/wopi*/files/<id>

    Request Headers:

    X-WOPI-SessionContext 上下文session参数值

    该接口需要返回的json格式如:

    {"BaseFileName":"test.docx","OwnerId":"admin","Size":798,"SHA256":"wlbRK+XNdLtHNaOcXnejbIVzHPHAZzI+1MhKNHUCVlw=","Version":"2016-03-17T02:27:33","SupportsUpdate":true,"UserCanWrite":true,"SupportsLocks":true,"WebEditingDisabled":false}

    说明:

    0.返回的属性名区分大小写,很多插件默认将头字母转换成小写,最终导致对接失败。

    1.所有的OWA客户端接口URl必须以/wopi开头

    如:

    http://localhost:5000/api/wopi/files/test.docx

    http://localhost:5000/api/wopi_test/files/test.docx

    2. SHA256的计算

    a.获取该文件的文件流

    b SHA256计算文件流Hash值

    c.将Hash值转换为Base64String

    string sha256 = "";
    using (FileStream stream = File.OpenRead(fileName))
    using (var sha = SHA256.Create())
    {
          byte[] checksum = sha.ComputeHash(stream);
          sha256 = Convert.ToBase64String(checksum);
    }

    3.验证action返回的结果,访问http://localhost:5000/api/wopi/files/test.docx,返回结果如下图

    GetFile服务

    当office web apps检验完文件信息后就可以获取文件了

    Method:GET

    URI: HTTP://server/<...>/wopi*/files/<id>/contents?access_token=<token>

    Request Headers:

    X-WOPI-MaxExpectedSize

    Response Headers:

    X-WOPI-ItemVersion 文件版本号类似于CheckFileInfo里的Version

    返回文件的二进制流

    [Route("files/{name}/contents")]
    [HttpGetAttribute]
    public FileStreamResult Get(string name, string access_token)
    {
          var file = "Files/" + name;
          var stream = new FileStream(file, FileMode.Open, FileAccess.Read);
          return new FileStreamResult(stream, "application/octet-stream");
    }

    PutFile服务

    Method:POST

    URI: HTTP://server/<...>/wopi*/files/<id>/contents?access_token=<token>

    Request Headers:

    X-WOPI-Override 固定值 PUT,必须

    X-WOPI-Lock 锁定请求的字符串标识(具体参考LOCK请求)

    Response Headers:

    X-WOPI-Lock锁定请求的字符串标识

    X-WOPI-LockFailureReason 锁定失败原因

    X-WOPI-ItemVersion 版本号

    请求内容为文件的二进制格式

    [Route("files/{name}/contents")]
    [HttpPostAttribute]
    public async void Post(string name, string access_token)
    {
          using (FileStream fs = System.IO.File.Create("Files/" + name))
         {
              await Request.Body.CopyToAsync(fs);
          }
    }

    至此基本的Office在线预览功能就基本完成了

    后续工作:

    1.规范请求和返回的头信息,完善功能实现在线编辑

    2.引入配置文件和缓存配置数据

    3.添加预览和编辑链接生成controller

    4.完善access_token验证逻辑

  • 相关阅读:
    Java基础之线程最详细最精简的介绍
    Android基础之Android硬件
    Iphone客户端程序员半年工作总结
    Java基础之synchronized的讲解
    物联网能否落地?可裁剪嵌入式OS成关键
    java基础之Thread与Runnable的区别
    Android基础之小问题集锦
    Java基础之字符串匹配大全
    BPM 是与非 什么是BPM,如何辨别是否BPM产品,以及如何选择BPM产品
    Hello China操作系统的安装和使用
  • 原文地址:https://www.cnblogs.com/liuxiaobo93/p/5819595.html
Copyright © 2011-2022 走看看