赞
踩
一、镜像安装:用OnlyOffice提供的Docker镜像安装OnlyOffice是比较方便和推荐的方法,因为它可以自动配置OnlyOffice的所有依赖项,从而减少安装和配置的复杂度。
sudo docker run --net host -i onlyoffice/documentserver
下载OnlyOffice的Docker镜像,在安装过程中可以根据需要自定义一些参数,例如指定文件存储路径、指定管理员账号等。sudo docker ps
查看已启动的容器,可以看到OnlyOffice服务已经运行起来了。http://服务器IP:端口号/
,即可进入OnlyOffice服务管理页面,输入管理员账号和密码进行登录。二、脚本安装:如果您不想使用Docker镜像,或者环境不允许,也可以通过以下方式安装OnlyOffice。
OnlyOffice提供了一个安装脚本,可以自动下载和安装所有必要的依赖项,并配置OnlyOffice服务。使用该方法安装OnlyOffice可以按照以下步骤进行操作:
wget http://download.onlyoffice.com/install/install.sh
sudo chmod +x install.sh
sudo ./install.sh
如果您希望卸载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进行二次开发的步骤如下:
<dependency>
<groupId>com.onlyoffice.documents</groupId>
<artifactId>onlyoffice-documentserver-java-sdk</artifactId>
<version>6.1.3</version>
</dependency>
DocumentServerClient client = new DocumentServerClient("http://your-documentserver.com/");
String token = client.security().requestToken();
EditorUrl editorUrl = client.editing().buildUrl(new DocumentRequest("document-url", "document-key"))
.editable()
.setToken(token)
.build();
对于二次开发者而言,OnlyOffice API和SDK的使用难度并不大,并且提供了丰富的文档和示例来帮助开发者快速上手。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。