我所有的代码都是用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

借助office web apps实现在线预览和在线编辑相关推荐

  1. office在线预览 word在线预览 .net在线预览 文件在线浏览接口

    office在线预览 word在线预览 excel在线预览 文件浏览接口服务 支持移动端浏览,只要能使用浏览器上网都可以使用,不需要安装任何第三方工具. 1.word在线预览 excel在线预览,.n ...

  2. 在线编辑、在线预览、在线转换,基于wps.js + java + react / vue,无需任何插件,零安装

    基于wps.js在线编辑.在线预览.文档转换前台vue / react,后台java终于开源啦,无需任何插件,零安装,可以直接配置完打包部署,也可直接集成项目中,或者二次开发,后续会不定期更新,有好的 ...

  3. 畅写Office云端SDK :“硬核”赋予企业应用在线文档I在线协作编辑I在线预览I在线格式转换服务

    畅写Office是北京稻壳互联数据科技有限公司旗下云端服务产品, 其云服务团队经过数月的努力,国内首次实现Office公有云SDK(类似微软Office365 SDK服务),以支持更多企业SAAS公有 ...

  4. java 文件在线预览_java 在线预览doc,pdf

    先说一说如何实现在线预览doc 网上查了很多资料,基本思路就是将 doc 转为 pdf,由于低版本浏览器不支持预览 pdf,所以基本是再将 pdf 转为 swf (使用FlexPaper + swft ...

  5. swf文件在线预览 html,在线浏览swf文件

    项目中需要将PPT实现在线浏览的,在网上找了很多资料,大部分都倡导用,格式转为swf,这样的方法来实现在线浏览PPT.所以记录一下这块的代码: pageEncoding="UTF-8&quo ...

  6. wps 在线预览、在线编辑 InvalidSignature问题排查

    1.官网加密方法,postman请求获取应用基本信息接口,报错 public JSONObject getWpsSignature(HttpServletRequest request) {Strin ...

  7. 在线文档预览方案-office web apps

    原文:在线文档预览方案-office web apps 最近在做项目时,要在手机端实现在线文档预览的功能.于是百度了一下实现方案,大致是将文档转换成pdf,然后在通过插件实现预览.这些方案没有具体实现 ...

  8. [转载]在线文档预览方案-Office Web Apps

    最近在做项目时,要在手机端实现在线文档预览的功能.于是百度了一下实现方案,大致是将文档转换成pdf,然后在通过插件实现预览.这些方案没有具体实现代码,也没有在线预览的地址,再加上项目时间紧迫.只能考虑 ...

  9. java图片的在线预览_【Java】web实现图片在线预览

    一.场景还原 用户上传了一张图片,已有服务器保存路径,现由于系统配置无法直接通过图片URL打开预览图片,需实现点击预览将图片显示在浏览器上. 二.实现方法 html: 预览 此处用预览按钮方法实现 J ...

最新文章

  1. 【笔试题】C语言:模拟实现strcat
  2. Golang的time包:秒、毫秒、纳秒时间戳输出
  3. java swftools linux_swftools linux下安装
  4. 【Java设计模式】GOF32 - 单例模式
  5. python并行运算库_最佳并行绘图Python库简介:“ HiPlot”
  6. C++ 多态原理初步01
  7. 开源数据库在平安的应用实践
  8. 【Spring】Spring boot的ApplicationContextAware 实现获取service
  9. boot客户管理系统源码_开源 SpringBoot+vueJs 前后端管理系统模版
  10. Springmvc源码分析之dispatcherServlet
  11. win10默认壁纸_小白个人系统安装美化(二)win10系统美化设置篇
  12. 分享一个在线301跳转代码生成工具
  13. linux kernel directory
  14. FillForm网页表单填写插件(用于火狐浏览器,自动填表,自动表单,填写表单)
  15. 达奇机器人不能用电脑编程吗_奇幻工房智能编程机器人达奇dash编程容易学吗?适合几岁小朋友玩?...
  16. 清理掉Win10“另存为“和“此电脑“里3D对象、视频、图片、文档、下载、音乐、桌面
  17. Opencv图像基本操作——读取、显示、截取图像、属性、颜色通道、边界填充、图像融合
  18. java面向对象的程序编程设计
  19. 怎么去掉ECShop购物流程中收货人电子邮箱必填
  20. 猜生日 Java小游戏

热门文章

  1. 第四周读书笔记《构建之法》
  2. 新手算法学习之路----二分法Last-position-of-Target
  3. Cocos2dx 3.11版本 视频添加跳过按钮
  4. coco2dx c++ HTTP实现
  5. 【10】jQuery学习——入门jQuery选择器之表单选择器
  6. Ext scope 学习
  7. 《当程序员的那些狗日日子》(三十六)无名的配角
  8. codeUp 2031 To fill or not to fill 复杂贪心
  9. 自己的路 php,生活感悟的句子:走自己的路,做自己的事
  10. java 8 中文API