office web apps 整合到自己项目中(wopi实现在线预览编辑)
借助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 fileInfo
info.BaseFileName = fileName
info.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 = true
info.SupportsLocks = true
w.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.docx
http:/owa服务器地址/p/PowerPointFrame.aspx?PowerPointView=ReadingView&WOPISrc=http//本地ip:8080/api/wopi/files/1.pptx
http://owa服务器地址/x/_layouts/xlviewerinternal.aspx?WOPISrc=http//本地ip:8080/api/wopi/files/1.xlsx
office web apps 整合到自己项目中(wopi实现在线预览编辑)的更多相关文章
- office web apps 整合Java web项目
之前两篇文章将服务器安装好了,项目主要的就是这么讲其整合到我们的项目中,网上大部分都是asp.net的,很少有介绍Java如何整合的,经过百度,终于将其整合到了我的项目中. 首先建个servlet拦截 ...
- Exchange 2013与 Office Web Apps 整合
好久没写什么新文章了,这里有关Office Web Apps 的部署我就省略了,只是在创建web场我一般 会创建2个url, 如: New-OfficeWebAppsFarm -InternalUrl ...
- 在Vue项目中 选择图片并预览
最近开始使用vue做项目 在这个过程中,碰到了大多数做前端肯定经历的一个问题,就是文件上传预览 花了点时间解决,因此分享一下预览功能的解决方案 页面: <div class="sele ...
- vue项目中编写一个图片预览的公用组件
今天产品提出了一个查看影像的功能需求. 在查看单据的列表中,有一列是影像字段,一开始根据单据号调用接口查看是否有图片附件,如果有则弹出一个全屏的弹出层,如果没有给出提示.而且,从列表进入详情之后,附件 ...
- 使用NextCloud搭建私有网络云盘并支持Office文档在线预览编辑以及文件同步
转载自:https://www.bilibili.com/read/cv16835328?spm_id_from=333.999.0.0 0x00 前言简述 描述:由于个人家里的NAS以及公司团队对私 ...
- java将office文档pdf文档转换成swf文件在线预览
第一步,安装openoffice.org openoffice.org是一套sun的开源office办公套件,能在widows,linux,solaris等操作系统上执行. 主要模块有writer(文 ...
- office web apps安装部署,配置https,负载均衡(一)背景介绍
Office Web Apps,简称owa,是微软开发的在线预览office 文件服务.只要是做web开发技术的技术人员都知道,office文件预览,对于网站来说,绝对是一个难点,目前常见的预览off ...
- 整合Office Web Apps至自己的开发系统
原文出处:http://www.cnblogs.com/poissonnotes/p/3267190.html 还可参考:https://www.cnblogs.com/majiang/p/36729 ...
- 【Office Web Apps】在 SharePoint 中使用 Office Web Apps
在 SharePoint 中使用 Office Web Apps 在安装并配置了 Microsoft Office Web Apps 的 SharePoint 网站上,通过 Office Web Ap ...
随机推荐
- L1-2. 点赞【求多组数据中出现次数最多的】
L1-2. 点赞 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持.每 ...
- Codeforces 401D Roman and Numbers
题目大意 Description 给定一个数 N(N<1018) , 求有多少个经过 N 重组的数是 M(M≤100) 的倍数. 注意: ①重组不能有前导零; ②重组的数相同, 则只能算一个数. ...
- MFC改变控件颜色
from http://www.cppblog.com/FandyM/archive/2010/07/21/120972.aspx MFC应用程序中,要改变控件的背景色可通过重载OnCtlColor( ...
- UITableView 滚动时使用reloaddata出现 crash'-[__NSCFArray objectAtIndex:]: index (1) beyond bounds (0)' Crash
例子: - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)in ...
- 八卦某 G 的前端开发方式及流程--百度FEX前端nwind信息搜集神技能
他山之石,可以攻玉. 话说本人从毕业到现在一直在某 B 公司工作,前些年折腾过不少开发方式和工具,但总觉得或许有更好的方案,所以很好奇其它公司内部是如何工作的,我曾经浏览过某 Y 公司内部无所不包的 ...
- awk如何区分shell脚本传进来的参数和自身的参数?awk如何获取shell脚本传进来的参数;awk中如何执行shell命令
问题:对于shell脚本,$0表示脚本本身,$1表示脚本的第一个参数,$2……依次类推:对于awk,$1表示分割后的第一个字段,$2……依次类推.那么对于shell脚本中的awk如何区分两者呢? 答案 ...
- 记录一下:关于mysql数据误删除恢复的问题
大概看来几篇博客: 1.delete的可以通过回滚(rollback)的方式恢复;但是前提是,你的数据表引擎是InnoDB而不是MyISAM,而且操作不是自动提交的 但是这种方式不可以恢复trunca ...
- win7 更改同步时间的网址
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\D ...
- TensorFlow 之 高层封装slim,tflearn,keras
tensorflow资源整合 使用原生态TensorFlow API来实现各种不同的神经网络结构.虽然原生态的TensorFlow API可以很灵活的支持不同的神经网络结构,但是其代码相对比较冗长,写 ...
- DIV浮动IE文本产生3象素的bug
描写叙述:DIV浮动IE文本产生3象素的bug 左边对象浮动.右边採用外补丁的左边距来定位,右边对象(div)会离左边有3px的间距 复现:在开发者工具里把文本模式设置了杂项后会出现3像素的bu ...