借助office web apps实现在线预览和在线编辑

我所有的代码都是用go语言编写,你可以直接编译后使用,不用再有其他的操作。
最近项目实在太忙,这几天才有时间,这次是重头戏,要好好琢磨一下怎么写,才能更简洁的说清楚一切。
上一节,我们已经安装完毕,安装好了office web apps。大家只要打开浏览器,访问自己的域地址,我的是app.datrix3.com,如果可以看见这个界面

那就说明你安装无问题了。接下来就要通过Wopi协议将OWA集成到自己的项目中了。

实现在线预览和编辑的Wopi协议

首先你要明白什么是wopi协议,相关的资料中,WOPI的全称是“Web Application Open PlatformInterface”,中文名为“Web应用程序开放平台接口协议”。
要知道,office web apps 可不会允许你直接去调用它相关的接口,网上的一张图就很好的说明了这点:

你可以看见,在WOPI中,存在WOPI Server(或者称之为WOPI Host)和WOPI Client两种角色,我们可以将WOPI-Client看作我们搭建的OWA服务器,
而WOPI Server就是我们要自己开发的Wopi服务,在图里可以看见,WOPI Client共向WOPI Server进行了两次请求,分别是Tell me about the file以及Give me the file,所以如果需要实现最简单的在线预览,你需要提供两个接口,如果要实现在线编辑,你还需要一个写入保存的接口。

第一个接口为:Tell me about the file,我将它定义为GetFileInfo,它的url为
http://{你自己的owa地址}/api/wopi/files/{file_name}
这里需要你以JSON形式OWA传参,参数至少要包括如下信息:
{ "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: 文件版本号,文件如果被编辑,版本号也要跟着改变。
下面是我的参数:

type fileInfo struct {BaseFileName   string `json:"BaseFileName"`OwnerId        string `json:"OwnerId"`Size           int64  `json:"Size"`SHA256         string `json:"SHA256"`Version        string `json:"Version"`SupportsUpdate bool   `json:"SupportsUpdate,omitempty"`UserCanWrite   bool   `json:"UserCanWrite,omitempty"`SupportsLocks  bool   `json:"SupportsLocks,omitempty"`
}

你可以看见,这里有文件的size,sha256,这里要用代码去获取:

//获取单个文件的大小
func getSize(path string) int64 {fileInfo, err := os.Stat(path)if err != nil {panic(err)}fileSize := fileInfo.Size()return fileSize
}
//获取sha256
func SHA256File(path string) (string, error) {buf, err := ioutil.ReadFile(path)if err != nil {return "", err}h := sha256.Sum256(buf)return base64.StdEncoding.EncodeToString(h[:]), nil
}

GetFileInfo接口代码:

func GetFileInfo(w http.ResponseWriter, r *http.Request) {log.Println("GetFileInfo")vals := r.URL.Query()tmp, ok := vals["access_token"]if !ok || len(tmp[0]) == 0 {log.Println("access_token not found!")}vars := mux.Vars(r)fileName := vars["file_name"]if len(fileName) == 0 {log.Println("file_name empty!")}log.Println("file_name: ", fileName)testFilePath := path.Join(".", fileName)log.Println("PATH: ", testFilePath)var info fileInfoinfo.BaseFileName = fileNameinfo.OwnerId = "admin"info.Size = getSize(testFilePath)info.SHA256, _ = SHA256File(testFilePath)log.Println("debug: sha256_b42: ", info.SHA256)// String value: eIMevgBhTd8Iqh1VjWbfWx7wd5vQvmDxlABMfz+pTiI=//info.SHA256 = "eIMevgBhTd8Iqh1VjWbfWx7wd5vQvmDxlABMfz+pTiI="info.Version = "2222"info.UserCanWrite = trueinfo.SupportsLocks = truew.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(info)log.Println("GetFileInfo done...")
}

接下来是第二个接口Give me the file,我将它定义为GetFileContent,用于WOPI Client获取文件,这个接口的url为:
http://owa服务器地址/api/wopi/files/{file_name}/contents
这个接口通过文件流的方式返回文件,代码如下

func GetFileContent(w http.ResponseWriter, r *http.Request) {log.Println("GetFileContent start.......")vals := r.URL.Query()tmp, ok := vals["access_token"]if !ok || len(tmp[0]) == 0 {log.Println("access_token not found!")}vars := mux.Vars(r)fileName := vars["file_name"]if len(fileName) == 0 {log.Println("file_name empty!")}log.Println("file_name: ", fileName)testFilePath := path.Join(".", fileName)data, err := ioutil.ReadFile(testFilePath)if err != nil {log.Println("read file err: ", err)return}w.Header().Set("Content-type", "application/octet-stream")w.Write(data)//json.NewEncoder(w).Encode(info)log.Println("GetFileContent done !")
}

如果你需要实现编辑的功能,你需要实现一个上传接口POSTfile,这个接口和上面那个url除了请求方式不同,其他都是一样的。
http://owa服务器地址/api/wopi/files/{file_name}/contents
代码如下

func PostFileContent(w http.ResponseWriter, r *http.Request) {log.Println("PostFileContent start..........")vals := r.URL.Query()tmp, ok := vals["access_token"]if !ok || len(tmp[0]) == 0 {log.Println("access_token not found!")}vars := mux.Vars(r)fileName := vars["file_name"]if len(fileName) == 0 {log.Println("file_name empty!")}log.Println("file_name: ", fileName)testFilePath := path.Join(".", fileName)log.Println("PATH: ", testFilePath)body, err := ioutil.ReadAll(r.Body)if err != nil {log.Println("body empty")}ioutil.WriteFile(testFilePath, body, os.ModeAppend)w.Header().Set("Content-type", "application/octet-stream")// get Path,get file}

现在三个接口都已经实现了,我们来看一下路由和具体的实现代码:

func main() {router := mux.NewRouter()router.HandleFunc("/api/wopi/files/{file_name}", GetFileInfo).Methods(http.MethodGet)router.HandleFunc("/api/wopi/files/{file_name}/contents", GetFileContent).Methods(http.MethodGet)router.HandleFunc("/api/wopi/files/{file_name}/contents", PostFileContent).Methods(http.MethodPost)//开启8080端口err := http.ListenAndServe(":8080", router)log.Println(router)if err != nil {log.Println("http listen err: ", err)}
}

接下来你就可以go build,然后跑服务了,我这里设置的文件路径都是本目录下的,也就是说,服务在test文件夹下跑起来,那么你的office文件也要放在test文件夹下。

最后,跑起来服务,应该访问的url如下:

http://owa服务器地址/we/WordEditorFrame.aspx?WOPISrc=http//本地ip:8080/api/wopi/files/1.docxhttp:/owa服务器地址/p/PowerPointFrame.aspx?PowerPointView=ReadingView&WOPISrc=http//本地ip:8080/api/wopi/files/1.pptxhttp://owa服务器地址/x/_layouts/xlviewerinternal.aspx?WOPISrc=http//本地ip:8080/api/wopi/files/1.xlsx

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

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

相关文章

Dbml文件提取建表TSql-CodeSmith

在昨天一个大学师弟,他问我能不能将LinqToSql文件转化为创建表的TSql语句,他是刚开始学习.NET,所以在网上下些示例看,但苦于没有数据库。所以就有了这一篇博客,作为我的Code生成技术的CodeSimth的最后一篇示例。在下一…

【转】新思想、新技术、新架构——更好更快的开发现代ASP.NET应用程序(续1)

上周星期天开通了博客并发布了第一篇文章《新思想、新技术、新架构——更好更快的开发现代ASP.NET应用程序》,汇集了一些比较流行的技术和开源项目,也把自己的程序架构、部分代码风格、前端表现简单做了一些展示,引起了近100位朋友的评论。特…

CCNA-Cisco-Packet-Tracerchs(思科官网)安装教程以及使用

Cisco-Packet-Tracerchs 思科官网模拟器,各大高校与中职都在使用。 但是由于支持的命令不太多,适用于NA阶段以及入门阶段的人群使用。 以下是免费百度网盘链接: https://pan.baidu.com/s/136fsYRnAfzGoj0DsQFaYTg 提取码: qa4e 复制这段内容…

CCNA-VLAN讲解与交换机三种端口模式(Acess,Trunk,Hybrid)小白入门级

VLAN讲解与三种端口模式(Acess,Trunk,Hybrid) TAG:所有文章均为原创,可以转载但请声明,是在学校里面做的,使用不了EVE和ENSP,请各路大神嘴下留情,如文章内容有误导请及时联系博主----来自一个17岁的中专生。 1.什么是V…

【转】2015-新思想、新技术、新架构——更好更快的开发现代ASP.NET应用程序

在博客园学习很长时间了,今天终于自己也开通了博客,准备分享一些感悟和经验。首先感谢博客园园主提供了这么好的程序员学习交流平台,也非常感谢张善友、dax.net、netfocus、司徒正美 等技术大牛的无私分享,从他们身上学到了很多。…

工作篇-佛山三水恒大-2020.10.23

** 工作篇-佛山三水恒大-2020.10.23 **人生第一次工作啊啊啊啊啊 其实按道理来说,第一次应该会很很紧张吧,不过我倒没有。 也不知道是我不怕还是什么,一切进行的挺顺利的。 前言:讲真那句,第一次做的话,…

UWP 使用OneDrive云存储2.x api(一)【全网首发】

最近开发人脸识别UWP【微识别 / WeRecognition】用到了OneDrive开发,下面把来龙去脉讲一下。 下载地址 https://www.microsoft.com/store/productId/9PDSNS7X9ST9,商店火爆热销中。。。。。。 由于UWP是跨平台的,一套代码可以运行在所有Wind…

UWP 使用OneDrive云存储2.x api(二)【全网首发】

上一篇提到为了给用户打造一个完全无缝衔接的最佳体验,UWP开发者最好也要实现App设置和数据的跨平台 分析了数据漫游和OneDrive的优缺点,结合自己App实际需要,我选择了OneDrive。 毕竟数据漫游100KB不够用啊。。。 这一次给大家我千辛万苦找…

在Sharepoint 2010中使用ReportViewer控件展示RDLC报表

微软的Visual studio提供了ReportViewer控件以及RDLC报表设计工具。下文主要介绍如何在Sharepoint 2010项目开发中使用ReportViewer和RDLC生成项目报表。由于Sharepoint 2010默认是禁用Session的,而RDLC报表必须启用Session。因此在Sharepoint的站点中要使用RDLC生成…

工作篇-佛山三水恒大-2020.11.13

** 工作篇-佛山三水恒大-2020.11.14 **TAG:此篇文章估计会很长,因为工作的时候变数太多了,预计五千字左右,想看的可以耐心看完,均为个人实战经验.害,其实是上学期间请假去做的,还挨批了. **到了现场tm的那个机房,小到我哭,站都没地方站,刚装修好全tm都是白灰,我穿的一身黑衣…

Windows Workflow Foundation(WWF)介绍

Windows Workflow Foundation:支持基于工作流的应用程序 工作流是一个简单思路:按照特定顺序执行的一系列步骤。您甚至可以认为每个应用程序都在执行工作流,因为每个应用程序都执行某些过程。但是,在使用 C#、Visual Basic 或其他…

CCNA-第五篇-基础命令集+设备升级+设备破解密码+IP地址{精髓篇}

** CCNA-第五篇-基础命令集 ** 1.基础命令集 思科设备 : IOS 华为设备: VRP 启动步骤:加电自检-加载系统(IOS/VRP)-运行配置(保留的cfg或者conf文件) 命令行统一称为CLI,CLI是啥呢,命令 简介:CLI一般指命令行界面。…

你还记得windows workflow foundation吗

很多年前,windows workflow foundation还叫WWF,而直译过来的名称让很多人以为它就是用来开发工作流或者干脆就是审批流的。 博主当年还是个懵懂的少年,却也知道微软不会大力推一个面向如此具象的业务场景的技术,于是特地找了一本…

SharePoint Desiger编辑模板时提示“服务器错误,拒绝访问”的解决之道

这篇文件已被微软收藏。http://technet.microsoft.com/zh-cn/ff683721.aspx各位同志好,很多同志都用过SharePoint designer来编辑模板。经常出现“服务器错误,拒绝访问”。场景描述:我们办公电脑是XP系统。XP系统我们是用自己的域用户名密码登…

CCIE理论-第六篇-SD-WAN网络(一)

** CCIE理论-第六篇-SD-WAN网络 ** 1.SD-WAN介绍 1.什么是SD-WAN SD-WAN Software Defined 软件定义WANWide Area Network 广域网外网通俗的说企业网关可以慢慢的代替传统组网(大趋势)主要作用,省钱,简单,智能.易管理 传统方式 -Internet专线 (固定IP上下行带宽对等) -PPPOE …

【转】TFS测试管理

微软2010年发布的Visual Studio 2010或Visual Studio Test Professional 2010包含一个称为 Microsoft 测试管理器的新应用程序,用于帮助您使用测试计划来定义和管理测试工作。 Microsoft 测试管理器通过Team Foundation Server 集成,使您可以方便地进行测…

CCNA-网络常用工具介绍篇

链接:https://pan.baidu.com/s/1Mo3B9LR6YF4YfzSkMwn5OA 提取码:7dc7 这是免费提供滴工具,虽然其实都能用到,不过也就发发了. 第一个呢是EVE,是基于VM下的,就是模拟器来的.里面有ova直接拉进去vm里面开机就可以使用了.前面好像也发过 第二个是ENSP,是华…

敏捷项目管理过程改进

一、为什么敏捷? 目前大环境智慧城市、人工智能、大数据,面向To B的业务等,在要求产品管理需要快速的需求响应,项目管理需要更强的整合协调。复杂的大环境,就在推动我们用最敏捷的方式迎接这个多变的市场。 二、传统和…

CCNA-第六篇-静态路由+动态路由开头

** CCNA-第六篇-静态路由动态路由 ** 一,路由概念 什么是路由? 路由呢,应该说是除了IP以外在网络世界中最重要的东西了 万物互联,互联网,都是基于路由的,前期的啥静态动态,后期的MPLS,包括看到的VPN,虚拟专线等.都是基于路由的,就是像建房子那样,你最得把地基打好才能做其…

【转】敏捷开发,你真的做对了吗?

缘起 2017年3月,应移动事业群智能营销平台项目管理部负责人邀请,我开始支持智能营销平台CRM团队。智能营销平台是阿里文娱广告团队,是阿里巴巴淘外变现的主力军。CRM团队负责开发和维护CRM系统。CRM系统服务于销售和代理商,串起商…