一、镜像安装:用OnlyOffice提供的Docker镜像安装OnlyOffice是比较方便和推荐的方法,因为它可以自动配置OnlyOffice的所有依赖项,从而减少安装和配置的复杂度。
- 首先需要安装Docker,可以参考官方文档进行安装:https://docs.docker.com/engine/install/
- 安装完Docker后,可在终端中通过命令
sudo docker run --net host -i onlyoffice/documentserver
下载OnlyOffice的Docker镜像,在安装过程中可以根据需要自定义一些参数,例如指定文件存储路径、指定管理员账号等。 - 等待下载完成后,使用命令
sudo docker ps
查看已启动的容器,可以看到OnlyOffice服务已经运行起来了。 - 接下来,通过浏览器访问
http://服务器IP:端口号/
,即可进入OnlyOffice服务管理页面,输入管理员账号和密码进行登录。 - 在管理页面中,可以管理用户、添加文档库、设置文档类型等,同时也可以将OnlyOffice与其他系统整合。
二、脚本安装:如果您不想使用Docker镜像,或者环境不允许,也可以通过以下方式安装OnlyOffice。
- 使用安装脚本进行安装
OnlyOffice提供了一个安装脚本,可以自动下载和安装所有必要的依赖项,并配置OnlyOffice服务。使用该方法安装OnlyOffice可以按照以下步骤进行操作:
- 下载安装脚本
wget http://download.onlyoffice.com/install/install.sh
- 将安装脚本赋予可执行权限并执行
sudo chmod +x install.sh
sudo ./install.sh
- 在脚本执行期间,您需要回答几个问题以配置OnlyOffice服务
如果您希望卸载OnlyOffice服务,可以运行以下命令:
sudo apt-get remove onlyoffice-doc* onlyoffice-communityserver*
sudo apt-get autoremove
- 从源代码编译安装
如果您是开发人员或对OnlyOffice的源代码进行修改,则可以从源代码手动编译和安装OnlyOffice。这种方法需要下载OnlyOffice的源代码和编译器,需要一些专业的技能和经验。
总而言之,使用Docker镜像是只使用OnlyOffice最简单的方式,但是如果您不想使用Docker镜像,使用安装脚本或从源代码编译安装OnlyOffice也是可行的。
安装好的页面长这样:
或者长这样
三、前端代码以最最简单的html为例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>在线预览</title>
</head>
<body>
<div class="form" style="width:100%;height:800px;">
<div id="iframeEditor"></div>
</div>
</body>
<script type="text/javascript" src="./jquery-3.7.0.min.js"></script>
<script type="text/javascript" >
$(function() {
// 获取onlyoffice 路径
var onlyoffice_url = "http://192.168.1.106:32774/";
var onlyoffice_js = onlyoffice_url + "/web-apps/apps/api/documents/api.js";
loadJS(onlyoffice_js, function() {
var fileType = "docx";
var fileName = "222.docx";
var key = "1111";//每次打开后要重新获取,否则编辑后打开还是编辑前的文件,如果是预览文件就没关系
var mode = "edit";//view查看
var url = "http://192.168.1.144:9088/onlyoffice_filePath/222.docx";
//编辑保存回调函数,保存的文件可以覆盖原来的文件,也可以新生成 (保证此接口是通的否则,文件显示不出来)
var callbackUrl = "http://192.168.1.102:9088/xxxxxx/CallBackServlet?fileName=222.docx";
var documentType = getDocumentType(fileType);
var config = {};
// 预览
if ("edit" == mode) {
config = {
document : {
fileType : fileType,
key :key,
title : fileName,
url : url
},
documentType : documentType,
editorConfig : {
callbackUrl : callbackUrl,
customization : {
forcesave : true,
leftMenu : false,
rightMenu : false,
chat : true,
comments : false,
about : false,
help : false,
plugins : false
},
user : {
id : "1",
name : "用户1"
},
hideRightMenu : false,
mode : mode,
lang : "zh-CN"
},
height : "100%",
width : "100%",
lang : "zh-CN"
};
} else {
//文件预览
config = {
document : {
fileType : fileType,
key : key,
title : fileName,
url : url
},
documentType : documentType,
editorConfig : {
customization : {
forcesave : false,
help : false,
toolbar : false,
statusBar : false,
autosave : false,
leftMenu : false,
rightMenu : false,
chat : false,
comments : false,
about : false,
help : false,
plugins : false,
spellcheck : false,
compactHeader : false
},
user : {
id : "2",
name : "用户2"
},
hideRightMenu : true,
mode : mode,
lang : "zh-CN"
},
height : "100%",
width : "100%",
lang : "zh-CN"
};
}
docEditor = new DocsAPI.DocEditor("iframeEditor", config);
});
/**
* 预览类型转化
*/
function getDocumentType(fileType) {
var ExtsDocument = new Array(".doc", ".docx", ".docm", ".dot", ".dotx",
".dotm", ".odt", ".fodt", ".ott", ".rtf", ".txt", ".html",
".htm", ".mht", ".pdf", ".djvu", ".fb2", ".epub", ".xps");
var ExtsSpreadsheet = new Array(".xls", ".xlsx", ".xlsm", ".xlt",
".xltx", ".xltm", ".ods", ".fods", ".ots", ".csv");
var ExtsPresentation = new Array(".pps", ".ppsx", ".ppsm", ".ppt",
".pptx", ".pptm", ".pot", ".potx", ".potm", ".odp", ".fodp",
".otp");
fileType = "." + fileType;
if (ExtsDocument.indexOf(fileType.toLowerCase()) > -1) {
return "text";
}
if (ExtsSpreadsheet.indexOf(fileType.toLowerCase()) > -1) {
return "spreadsheet";
}
if (ExtsPresentation.indexOf(fileType.toLowerCase()) > -1) {
return "presentation";
}
}
/**
*进入页面后动态加载onlyOffice所需要引入的js(实际运用引入js时IP和端口一般不固定)
*/
function loadJS(url, callback) {
var script = document.createElement('script'), fn = callback
|| function() {
};
script.type = 'text/javascript';
if (script.readyState) {
script.onreadystatechange = function() {
if (script.readyState == 'loaded'
|| script.readyState == 'complete') {
script.onreadystatechange = null;
fn();
}
};
} else {
// 其他浏览器
script.onload = function() {
fn();
};
}
script.src = url;
document.getElementsByTagName('head')[0].appendChild(script);
}
});
</script>
</html>
再次强调如果你检查文件路径,onlyoffice服务路径,出现了下面这样的情况不要慌,那就是我说的保存回调函数不通,文件出不来
四、后端官网给出的测试代码也很多,我写了个Servlet,使用的时候注意几点,多人协同时状态6,2根据业务可以控制,以及前端的key多人协同,key相同打开就是一样的。
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.URL;
import java.util.Scanner;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import com.jb.util.platform.Platform;
/**
* 将编辑后的文件返回保存
*/
@WebServlet(name = "CallBackServlet", urlPatterns = {"/CallBackServlet"})
public class CallBackServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String sep = File.separator;
@Autowired
private JdbcTemplate jdbcTemplate;
public CallBackServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer = null;
JSONObject jsonObj=null;
try {
writer = response.getWriter();
@SuppressWarnings("resource")
Scanner scanner = new Scanner(request.getInputStream()).useDelimiter("\\A");
String body = scanner.hasNext() ? scanner.next() : "";
try {
jsonObj = (JSONObject) new JSONParser().parse(body);
} catch (org.json.simple.parser.ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*
0-找不到具有密钥标识符的文档,
1-正在编辑文档,
2-文件已准备好保存,
3-发生文档保存错误,
4-文件已关闭,没有更改,
6-正在编辑文档,但保存了当前文档状态,
7-强制保存文档时出错。
* */
if ((long) jsonObj.get("status") == 2) {
/*
* 当我们关闭编辑窗口后,十秒钟左右onlyoffice会将它存储的我们的编辑后的文件,,此时status = 2,
通过request发给我们,我们需要做的就是接收到文件然后回写该文件。
* */
/*
* 定义要与文档存储服务保存的编辑文档的链接。当状态值仅等于2或3时,存在链路。
* */
String downloadUri = (String) jsonObj.get("url");
System.out.println("====文档编辑完成,现在开始保存编辑后的文档,其下载地址为:" + downloadUri);
//这里加在即的业务名
URL url = new URL(downloadUri);
java.net.HttpURLConnection connection =
(java.net.HttpURLConnection) url.openConnection();
InputStream stream = connection.getInputStream();
//更换为实际的路径
String filePath = "D://demo";
File path = new File(filePath);
File savedFile = new File(filePath+sep+fileName);
if(!path.exists()){
path.mkdirs();
}
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 (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
官网明确给出了不同语言,框架的测试代码。例如Java,Java Spring,PHP,Node.js,C#等。
测试代码下载地址:https://api.onlyoffice.com/editors/demopreview?type=text#DemoPreview
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A7FVZhT4-1686541531242)
以Java为例,使用OnlyOffice SDK进行二次开发的步骤如下:
- 在项目依赖中添加OnlyOffice SDK
<dependency>
<groupId>com.onlyoffice.documents</groupId>
<artifactId>onlyoffice-documentserver-java-sdk</artifactId>
<version>6.1.3</version>
</dependency>
- 创建OnlyOffice DocumentServer客户端对象
DocumentServerClient client = new DocumentServerClient("http://your-documentserver.com/");
- 请求Token
String token = client.security().requestToken();
- 打开文档(文档的URL和Key需要进行参数替换)
EditorUrl editorUrl = client.editing().buildUrl(new DocumentRequest("document-url", "document-key"))
.editable()
.setToken(token)
.build();
对于二次开发者而言,OnlyOffice API和SDK的使用难度并不大,并且提供了丰富的文档和示例来帮助开发者快速上手。