Office web app提供了很全面的功能,不仅可以使用sharepoint查看文档,也可以将其集成到我们自己的项目中。
如果项目只用到了文档的在线预览功能,直接使用owa服务生成的url或者iframe标签就能够在网页中浏览office格式的文档。但是如果希望使用其他功能,还是需要自己开发wopi host。
我们需要通过wopi协议将owa的服务集成到我们自己的系统之中,WOPI的全称是“Web Application Open PlatformInterface”,中文名为“Web应用程序开放平台接口协议”。
在WOPI中,存在WOPI Server(或者称之为WOPI Host)和WOPI Client两种角色,owa用作WOPI Client,而我们所开发的部分用作WOPI Server。这个协议的交互过程见下图:
在图中我们能够看到,WOPI Client共向WOPI Server进行了两次请求分别是Tell me about the file以及Give me the file。因此我们所开发的WOPI Server至少需要提供两个接口以实现这两个功能。
第一个接口是Tell me about the file,这个接口的url为:
GET http:// [owas.domain]/<...>/wopi/files/filename
owas.domain是服务器的地址,file是文件的路径,此接口以JSON的格式返回文件的信息,JSON各参数详见WOPI消息体结构,但至少要包含以下信息:
{
"BaseFileName": "Sample Document.docx",
"OwnerId": "tylerbutler",
"Size": 300519,
"SHA256":"+17lwXXN0TMwtVJVs4Ll+gDHEIO06l+hXK6zWTUiYms=",
"Version":"GIYDCMRNGEYC2MJREAZDCORQGA5DKNZOGIZTQMBQGAVTAMB2GAYA===="
}
BaseFileName: 文件名。
OwnerId: 文件所有者的唯一编号。
Size: 文件大小,以bytes为单位。
SHA256: 文件的256位bit的SHA-2编码散列内容。(Wordweb app必有,excel和ppt可以为null)
Version: 文件版本号,文件如果被编辑,版本号也要跟着改变。
另一个是Give me the file,用于WOPI Client获取文件,这个接口的url为
GET http:// [owas.domain]/<...>/wopi/files/filename/contents
这个接口通过文件流的方式返回文件,注意返回的文件名就叫“contents”即可,变成原文件的名称不仅费事,还有可能出现问题。
如果需要实现在线编辑的功能,还需要增加一个POST的接口,用于将修改后的文件上传,url如下:
POST http:// [owas.domain]/<...>/wopi/files/filename
可以看到这个接口除了HTTP请求方式不同,url和第一个接口时一样的,这样WOPI Client能够很容易的定位文档的位置。
最后在浏览器中打开文档的地址类似下面的格式:
http://[owas.domain]/we/WordEditorFrame.aspx?WOPISrc=http%3a%2f%2flocalhost%3a8080%2fwopi%2ffiles%2fword.docx&access_token=[token]&ui=zh-CN
http://[owas.domain]/p/PowerPointFrame.aspx?PowerPointView=ReadingView&WOPISrc=http%3a%2f%2flocalhost%3a8080%2fwopi%2ffiles%2fppt.pptx&access_token=[token]&ui=zh-CN
http://[owas.domain]/x/_layouts/xlviewerinternal.aspx?WOPISrc=http%3a%2f%2flocalhost%3a8080%2fwopi%2ffiles%2fBook1.xlsx&access_token=[token]&ui=zh-CN
实现的效果见下图:
服务器实现可以参考https://github.com/marx-yu/WopiHost,感觉实现的比较全面而且代码比较简洁。
参考文章:http://www.cnblogs.com/poissonnotes/p/3267190.html