.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验证逻辑

转载于:https://www.cnblogs.com/liuxiaobo93/p/5819595.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-upload上传组件的动态添加;el-upload动态上传文件;el-upload区分文件是哪个组件上传的。

需求&#xff1a;正常我们上传都是一个固定的文件传到固定的后端字段里去。 但是有可能遇到&#xff0c;这种自定义新增多个上传组件&#xff0c;也就是遍历数组似的多个同样的上传组件 此时就遇到一个问题&#xff1a;因为是遍历出来的上传组件&#xff0c;导致上传成功:on-su…

openwrt gpio控制与使用

查看datasheet和确认GPIO复用引脚scheme 通过查看mt7628 datasheet可以明确复用关系&#xff1a; 在这里我以I2S对应的GPIO引脚为例。 查看 mt7628an.dtsi 文件中对gpio的注册 $(TOPDIR)假定为宿主机上 OpenWrt 的编译目录。 在$(TOPDIR)/target/linux/ramips/dts/mt7628an.d…

git 配置图形比较工具

2019独角兽企业重金招聘Python工程师标准>>> 以meld为例&#xff0c;安装方式是sudo apt-get install A. 在/usr/local/bin 目录下创建extDiff 文件(注意: 目录可以是任意) cd /usr/local/bin sudo gedit /usr/local/bin 内容为: #!/bin/bash /usr/bin/meld "$…

推荐!!!前端将url转成blob和blob转成url;前端将文件流读取成url;前端将blob文件读取出url预览和下载

一般后端返回的地址&#xff0c;前端通过返回blob读取出url&#xff0c;然后使用a标签下载 方式一&#xff1a;通过接口将后端返回的文件流blob读取出url&#xff08;推荐推荐&#xff09; downLoadFileImg (fileUrl, fileName) {// 可下载&#xff0c;名称也有效 -- 推荐cons…

CH340电路设计

最近选用USB转串口芯片进行开发调试&#xff0c;在调研了各主流芯片的之后&#xff0c;觉得 CH340 系列的性价比很高&#xff0c;而且技术支持在国内&#xff0c;如果遇到问题解决起来也会方便很多。但是 CH340 / CH341 型号很多&#xff0c;具体选型就就该结合需求和芯片手册了…

vue拖拽列表----vuedraggable组件;ElementUI 实现Table组件实现拖拽效果

vue-draggable中文文档 简单的遍历list列表拖拽 部分元素不可拖拽参考&#xff1b; 部分不可拖拽参考 ElementUI 实现Table组件实现拖拽效果 列表的拖拽功能&#xff1a; 一、下载依赖 npm i -S vuedraggable二、页面使用 <template><div><vuedraggable cla…

filters获取data中的数据;filters使用data中的数据

如果直接在filters中通过this引入data数据&#xff0c;则无效获取不到。 可以通过filter方法传值 来获取data的数据使用 <div >{{formInline.bjthObj.insuranceCompanyName | CompanyVal(cops)}}</div>data () {return {insuranceCompanyName: ,cops:[],}}filters:…

spring MVC配置详解

From: http://www.cnblogs.com/superjt/p/3309255.html 现在主流的Web MVC框架除了Struts这个主力 外&#xff0c;其次就是Spring MVC了&#xff0c;因此这也是作为一名程序员需要掌握的主流框架&#xff0c;框架选择多了&#xff0c;应对多变的需求和业务时&#xff0c;可实行…

Altium Designer如何画虚线

流程如下&#xff1a; 在原理图上右键 --> Place --> Drawing Tools --> Line&#xff0c;在画线的时候按 Tab 键&#xff0c;然后将 Line Style 改为 Dashed&#xff0c;就可以画虚线了。

node.js 和 HTML5-Canvas 结合实现截图上传交互

楼主要做一个简单的图片上传服务器&#xff0c; node.js实现服务端&#xff0c; 页面使用HTML5-Canvas实现截图。 为什么用Nodejs呢&#xff0c;因为用Js写后台很爽-。- 而且比较简单 为什么用canvas呢&#xff0c;其实我不想用的 因为有些低版本的IE对HTML5的支持不好&#xf…

通过文件url地址获取base64;通过图片url地址获取base64;js获取文件的base64

本篇是通过url地址获取文件的base64 如果想要通过File文件获取base64查看这篇 以下代码可直接复制使用&#xff01;注意第9行的图片地址更改下 <template><div class"content"><div>获取图片的base64</div><input type"file" …

FineReport报表和J2EE应用的集成

From: http://www.blogjava.net/fannie/archive/2013/05/08/398985.html FineReport是一个纯Java软件&#xff0c;因此对于J2EE的项目&#xff0c;可以做到无缝集成。 报表服务器并非物理概念的服务器&#xff0c;而是以一个标准的J2EE应用的形式或者jar包的形式提交给程序。应…

vue使用jszip和file-save下载文件并打包;vue前端下载多个文件b并打包;

场景&#xff1a; 一般是后端直接将多个文件打包好&#xff0c;前端调用下载地址下载打包&#xff1b;但是文件太多会导致下载接口时间过长和服务器爆掉&#xff1b;故采用前端先将多个文件下载然后进行打包&#xff1b; 注意点&#xff1a; 1.先获取所有下载的文件路径和包含后…

【BZOJ1085】骑士精神

迭代加深搜索。 剪枝&#xff1a;当满足以下任意一个条件退出&#xff1a; 1.当前已搜到答案时&#xff08;ans!-1||sum0&#xff09; 2.剩余步数1<当前局面与目标局面不同的格子数sum 时&#xff08;因为n步最多改变n1个格子&#xff09; 3.当前步数>当前规定最大步数时…

CH340电路设计注意事项

在前面两篇博客提到了CH340的电路设计以及芯片选型&#xff0c;本文将重点放在使用CH340芯片进行电路设计的一些细节与注意事项。 电压匹配问题 CH340 芯片通过 USB 转换出来的 TTL 串口输出和输入电压是根据芯片供电电压是自适应的。也即&#xff0c;如果芯片是 5V 供电&…

解决 Visual Studio 中代码注释自动折叠的问题

今天突发奇想&#xff0c;打算把存储过程以注释的形式放在代码中进行版本管理&#xff0c;比如下面的代码&#xff1a; 由于存储过程很长&#xff0c;注释占了很多行&#xff0c;严复影响了正常代码的排版与阅读体验。之前也遇到过这样的场景&#xff0c;当时通过手动添加regio…

Newtonsoft.Json高级用法

From: http://www.cnblogs.com/yanweidie/p/4605212.html 手机端应用讲究速度快&#xff0c;体验好。刚好手头上的一个项目服务端接口有性能问题&#xff0c;需要进行优化。在接口多次修改中&#xff0c;实体添加了很多字段用于中间计算或者存储&#xff0c;然后最终用Newtonso…

Android 经典示例,初学者的绝好源码资料

2019独角兽企业重金招聘Python工程师标准>>> Android 经典示例&#xff0c;初学者的绝好源码资料 附上源码&#xff1a; 转载:http://www.adobex.com/android/source/details/00000374.htm 转载于:https://my.oschina.net/androidcode/blog/104696

CH340 Linux驱动使用教程

在官方Linux内核版本中自Kernel2.6以后就默认包含了对CH340/CH341芯片的驱动支持了&#xff0c;但比较遗憾的是该自带驱动版本较老&#xff08;由开源社区开发者提交&#xff09;已不能满足使用需求了&#xff0c;因此我们需要用芯片官网提供的新驱动进行替换链接。 1. 首先去…