使用docker在线/离线部署onlyoffice,在线预览/编辑demo

7,474 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 废话不多说,能看到这篇文章的,多半对自己的需求已经很明确了,OnlyOffice能干什么就不描述了,上干货。

安装环境

centos 7+docker,本文是以docker的形式进行onlyoffice部署,docker的方式比较简单。 下面这个是onlyoffice给出的环境要求

CPU: dual core 2 GHz or better
RAM:2 GB or more
HDD:at least 40 GB of free space
Additional requirements:at least 4 GB of swap
OS:amd64 Linux distribution with kernel version 3.10 or later
Additional requirements
    Docker: version 1.10 or later

在线拉取onlyoffice镜像

执行以下命令即可拉取镜像,下载过程需要一点时间:

sudo docker run -i -t -d -p 80:80 --restart=always onlyoffice/documentserver

该命令拉取镜像后,onlyoffice已经启动了一个容器了。不过只映射了http的80端口,没有启动https,https的配置这里就不讲了,请参考官方文档; 浏览器访问:http://yourip/web-apps/apps/api/documents/api.js 你能看到以下页面就证明你的onlyoffice部署成功了。

在这里插入图片描述

离线方式安装Onlyoffice

链接:pan.baidu.com/s/1jwwTIQGL… 提取码:ssz9

docker安裝

准备docker的依赖(下载docker.zip解压即可)。

安装依赖时忽略依赖,将docker文件夹中的所有rpm进行安装:

rpm ivh docker/* --nodeps --force

安装好后,启动docker

systemctl daemon-reload systemctl enable docker systemctl start docker

导入onlyoffice镜像

注:上面的压缩包里面的镜像是我处理过的镜像,你可以下载干净的镜像做同样的操作 设置enforce:setenforce 0

导入镜像: docker load < onlyoffice_ch_http.tar 后台启动: docker run -i -t -d -p 80:80 onlyoffice/ch-en-http

一个demo

官网上有一个springmvc+jsp的demo,这里就不讲了,讲下我的简单demo: 一个html+2个接口: demo.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<style>
		html,body{width:100%;height: 100%;}
		#placeholder{
			height: 100%;
		}
	</style>
	<body>
		<div id="placeholder" ></div>
		<script type="text/javascript" src="http://172.27.13.138:7000/web-apps/apps/api/documents/api.js"></script>
		<script>
		//这个配置在api.js里面有详细描述
			var config = {
					"type": "desktop",
					"width": "100%",
					"height": "100%",
					"documentType": "text",
					"document": {
					  "title": "demo.doc",
					  //该url是onlyoffice下载文档的路径,注意这个url是onlyoffice容器可达的路径,不然你打开office会告诉你下载不了。
					  //留个问题:我在主机上启动文件下载服务,onlyoffice在docker里面,然后用虚拟ip段的192.168.206.1作为服务ip,在虚拟机里面肯定能ping通,并且也能正常访问url
					  //,但是onlyoffice却无法下载文件,这是什么问题,请知道的大佬留言告知下。
					  "url": "http://172.27.13.188:7071/document/file/04cb6872e62c495c8708db06897ed618",
					  "fileType": "doc",
					  //key是onlyoffice下载文档格式化后存储到onlyoffice里面的key值,下次读取相同key值得文档时,不会再通过url加载。
					  "key": "14c2872e62c495c8708db06897ed618",
					  "info": {
						"owner": "liuwanli_email@163.com",
						"uploaded": "2020-01-03T02:28:28.000+0000"
					  },
					  //一些授权,都能懂得
					  "permissions": {
						"edit": true,
						"download": false,
						"review": true,
						"print": true,
						"changeHistory": false,
						"comment": true,
						"modifyFilter": true,
						"modifyContentControl": true,
						"fillForms": true
					  }
					},
					"editorConfig": {
					  "mode": "edit",
					  //en-ch 英文模式/zh-CN 中文模式,onlyoffice自身支持汉化,不存在网上那些加入字体后汉化的说法(我的版本是5.4.2-46),加入字体是在编辑文档的时候用的,后续会讲到
					  "lang": "zh-CN",
					  "location": "zh-CN",
					  "canCoAuthoring": false,
					  //文档编辑的回调,在编辑完成后,关闭该页面后的10S左右,onlyoffice服务会通过该接口将编辑后的文档流推送过来
					  "callbackUrl": "http://172.27.13.188:7071/document/callback/?id=04cb6872e62c495c8708db06897ed618",
					  "user": {
						"id": "zs",
						"name": "張三"
					  },
					  "customization": {
						"chat": true,
						"comments": true,
						"zoom": 100,
						"compactToolbar": false,
						"leftMenu": false,
						"rightMenu": false,
						"hideRightMenu": true,
						"toolbar": true,
						"statusBar": true,
						"autosave": true,
						"forcesave": false,
						"commentAuthorOnly": false,
						"showReviewChanges": false,
						"help": false,
						"compactHeader": false,
						"toolbarNoTabs": false,
						"reviewDisplay": "original"
					  },
					},
				  }
				  //点睛之笔
			var docEditor = new DocsAPI.DocEditor("placeholder", config);
		</script>
	</body>
</html>

所需的两个接口就在上面的html里面,下载文档的接口怎么写就不说了,不知道的面壁去。

callbackUrl:

注意几点:

  1. 接口是post
  2. 在页面打开的时候,页面会调用回调接口,传参status = 1,此时需要回调接口返回{"error":"0"},0表示回调接口没问题,可以正常使用,这个样在后面关闭编辑页面后才会调用该接口。
    @PostMapping("callback")
    public JSONObject callback(HttpServletRequest request, HttpServletResponse response) {
        JSONObject result = new JSONObject();
        try {
            String body = "";
            Scanner scanner = new Scanner(request.getInputStream());
            scanner.useDelimiter("\\A");
            body = scanner.hasNext() ? scanner.next() : "";
            scanner.close();
            if (body.isEmpty())
            {
                result.put("msg","empty request.getInputStream");
            }
            JSONObject jsonObj = JSON.parseObject(body);
            int status = (Integer) jsonObj.get("status");
            int saved = 0;
            if(status == 2 || status == 3) //MustSave, Corrupted
            {
                String downloadUri = (String) jsonObj.get("url");
                try
                {
                    URL url = new URL(downloadUri);
                    java.net.HttpURLConnection connection = (java.net.HttpURLConnection) url.openConnection();
                    InputStream stream = connection.getInputStream();
                    if (stream == null)
                    {
                        throw new Exception("Stream is null");
                    }
                    String path = request.getParameter("path");
                    File savedFile = new File(upload_file_path+"/"+path);
                    try (FileOutputStream out = new FileOutputStream(savedFile))
                    {
                        int read;
                        final byte[] bytes = new byte[1024];
                        while ((read = stream.read(bytes)) != -1)
                        {
                            out.write(bytes, 0, read);
                        }

                        out.flush();
                    }
                    connection.disconnect();
                }
                catch (Exception ex)
                {
                    saved = 1;
                    ex.printStackTrace();
                }
            }
            result.put("error",saved);
        } catch (IOException e) {
            result.put("error",-1);
        }
        return result;
    }

至此,office文档在线预览,编辑的环境部署完成。 下一篇文章讲解如何给onlyoffice添加字体,目前onlyoffice有一抹多不明所以的字体:

在这里插入图片描述

传送门:onlyoffice添加删除字体