onlyoffice整合springboot+vue實現文檔在線編輯保存

項目上需要用到在線word、excel文檔編輯功能,通過游覽器在線打開一個遠程的word文檔編輯保存,這里記錄下整合思路。

onlyoffice簡介

ONLYOFFICE 是一款開源的辦公套件,提供了一系列在線文檔編輯和協作工具,適用于團隊和個人使用。它支持文檔、表格、演示文稿等格式的創建、編輯和共享,類似于 Google Docs、Microsoft Office 365 等辦公軟件。
官方文檔:https://api.onlyoffice.com/zh-CN/docs/docs-api/get-started/basic-concepts/

onlyoffice部署安裝

使用onlyoffice我們需要先部署一套文檔服務onlyoffice/documentserver,它是onlyoffice辦公套件的核心組件之一,主要用于處理文檔的在線編輯和協作功能。它是 ONLYOFFICE 的文檔處理服務器,專門負責處理用戶上傳的文檔,支持文檔、表格和演示文稿等格式的在線編輯。
這是部署方式選擇docker,比較簡單一條命令即可:

docker run -i -t -d -p 9097:80 --privileged=true \
--name docserver --restart=always -e TZ=Asia/Shanghai \
-e ALLOW_PRIVATE_IP_ADDRESS=true -e JWT_ENABLED=false \
onlyoffice/documentserver

其中參數JWT_ENABLED=false是關閉簽名校驗,內網使用的話關掉整合起來會方便些,參數ALLOW_PRIVATE_IP_ADDRESS是允許內網IP回調,documentserver本身回調我們的業務系統,如果是內網的IP需要設置這個參數,否則默認回調不到,這里我被坑了半天,一直以為是docker網絡配置問題。

VUE整合

這里可以參考官方文檔的這一頁:https://api.onlyoffice.com/zh-CN/docs/docs-api/get-started/frontend-frameworks/vue/
參考文檔按照以下命令可以創建一個vue使用onlyoffice的范例:

# 創建一個名為 _onlyoffice-vue-demo_ 的 Vue.js 3.x 項目
npm create vue@3
# 進入新創建的目錄
cd onlyoffice-vue-demo
# 安裝 ONLYOFFICE 文檔 Vue.js 組件,并使用 _--save_ 將其保存到 _package.json_ 文件中
npm  install  --save @onlyoffice/document-editor-vue

打開工程將項目中的 ./src/App.vue 文件,并將其內容替換為以下代碼:

<template><DocumentEditor id="docEditor" documentServerUrl="http://192.168.3.96:9097/":config="config":events_onDocumentReady="onDocumentReady":onLoadComponentError="onLoadComponentError"height="900px"/> 
</template><script lang="ts">
import { defineComponent } from 'vue';
import { DocumentEditor } from "@onlyoffice/document-editor-vue";export default defineComponent({name: 'ExampleComponent',components: {DocumentEditor},data() {return {config: {document: {fileType: "docx",key: "Khirz6zTPdfd7",title: "這是一個測試文檔",url: "https://home.chengpei.top:8443/root/491f72dd4faa38a214dd8bd1ddb552a9.docx"},documentType: "word",editorConfig: {callbackUrl: "http://192.168.3.213:8080/url-to-callback"},// token: "xxxxxxxxxxxx"}}},methods: {onDocumentReady() {console.log("Document is loaded");},onLoadComponentError (errorCode, errorDescription) {switch(errorCode) {case -1: // Unknown error loading componentconsole.log(errorDescription);break;case -2: // Error load DocsAPI from http://documentserver/console.log(errorDescription);break;case -3: // DocsAPI is not definedconsole.log(errorDescription);break;}}},
});
</script>

這里需要特別注意的幾個參數如下:
documentServerUrl: documentserver服務的URL,也就是上面docker搭建的服務
config: 這是當前要編輯的文檔的描述配置,包含文檔信息(document)、文檔類型(documentType)、編輯配置(editorConfig)、簽名(token)等
callbackUrl: 保存回調地址,當發生編輯器打開、關閉、強制保存等操作時,會回調我們的業務系統執行對應操作,比如保存文件之類的,這是一個我們業務系統必須實現的接口
token: 簽名如果在部署documentserver時配置了JWT_ENABLED=true則簽名是必須傳的,簽名的計算邏輯參考官方文檔:https://api.onlyoffice.com/zh-CN/docs/docs-api/additional-api/signature/

其中config參數按理說不應該前端這么寫死的,config中的參數全都是當前這個待編輯文件的相關信息,應該直接又后端業務系統返回,比如:頁面上展示了一些可編輯文件列表,選擇某個文件點擊編輯時,后端根據原則的文件組裝config信息,包含文件的ID(key)、文件類型(fileType)、文件下載地址(url)等,前端拿到config直接傳給DocumentEditor組建打開一個onlyoffice的文件編輯窗口即可編輯了,文件編輯過程中是自動保存的,文件有變動馬上會觸發保存,但是這是文件并不是真的保存了,直到窗口關閉了,或者前端調用了強制保存了,documentserver會回調上面配置的callbackUrl接口,傳入以下請求體:

{"actions": [{"type": "DISCONNECTED","userid": "uid-1756171298433"}],"changesurl": "http://192.168.3.96:9097/cache/files/data/111ac2d8a0815d729fa9_702/changes.zip/changes.zip?md5=Ojhah6-hu1pd_VOr8-uJrA&expires=1756197053&shardkey=undefined&filename=changes.zip","filetype": "docx","history": {"serverVersion": "9.0.4","changes": [{"documentSha256": "fcffb173437380e77bd16661b2a1be0e71c40bb318184acd64da061b3621c186","created": "2025-08-26 08:15:42","user": {"id": "uid-1756171298433","name": "Anonymous"}}]},"key": "111ac2d8a0815d729fa9","status": "SAVE","url": "http://192.168.3.96:9097/cache/files/data/111ac2d8a0815d729fa9_702/output.docx/output.docx?md5=raC8B92ncNB4wcvrRz1CkQ&expires=1756197053&shardkey=undefined&filename=output.docx","users": ["uid-1756171298433"]
}

其中url為修改后的文件,業務系統收到該回調后可以保存該文件,實現業務上的文件保存功能。
前端也可以手動調用接口出發回調強制保存,詳細參考官方文檔命令服務 - forcesave

后端回調接口實現

這里后端使用springboot,實現以下這個接口即可:

@PostMapping(value = "/url-to-callback")
public String callback(@RequestBody final Callback body) {log.info("======== url-to-callback ========");try {String bodyString = JSONUtil.toJsonStr(body);if (bodyString.isEmpty()) {  // if the request body is empty, an error occursthrow new RuntimeException("{\"error\":1,\"message\":\"Request payload is empty\"}");}log.info(bodyString);// TODO 判斷當前是什么操作什么狀態,根據情況保存url里的文件} catch (Exception e) {String message = e.getMessage();if (!message.contains("\"error\":1")) {log.error("callback Exception", e);}return message;}return "{\"error\":\"0\"}";
}

Callback是onlyoffice SDK依賴里的一個類,封裝了回調的參數依賴如下:

<dependency><groupId>com.onlyoffice</groupId><artifactId>docs-integration-sdk</artifactId><version>1.4.0</version>
</dependency>

你也可以在回調地址后面拼上?param=xxx傳一些自定義的參數,通過@RequestParam拿到

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920231.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920231.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920231.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux筆記10——shell編程基礎-4

補充$#——取參數個數“$n”,有值取值&#xff0c;無值取空字符&#xff0c;一般都會加引號&#xff0c;在某些情況下避免報語法錯誤一、read接收鍵盤輸入[rootlocalhost ~]# cat demo.sh #!/bin/bash echo -n "請輸入你的姓名&#xff1a;" read nameecho "你…

(Redis)過期刪除策略

1. 背景Redis 支持為 Key 設置過期時間&#xff08;TTL&#xff09;&#xff0c;讓數據在一定時間后自動失效。 例如&#xff1a;SET session:1001 "userA" EX 60 # 60 秒后過期但是問題來了&#xff1a;Key 到期后&#xff0c;Redis 什么時候、如何刪除它&#xf…

nodejs 集成mongodb實現增刪改查

初始化項目: npm init -y npm install mongoose -save 安裝mongoose 插件 mongoose 鏈接數據庫語法&#xff1a; mongodb://[username:password]host1[:poert1],host2[:port2]…/[databsase]?[options…] userame&#xff1a; 用戶名 passwrod: 密碼 host1:port1,host2:port…

音視頻學習(五十八):STAP-A模式

什么是 STAP-A&#xff1f; STAP-A 是一種特殊的 RTP 封裝機制&#xff0c;專為 H.264 和 H.265 這類視頻編碼協議設計。它的核心目的只有一個&#xff1a;將多個小的 NALU&#xff08;網絡抽象層單元&#xff09;打包進一個 RTP 包中&#xff0c;以此來減少網絡開銷&#xff0…

管理型交換機通過VLAN劃分實現不同IP跨網段通信配置方法

管理型交換機應用場景豐富&#xff0c;如果要實現不同IP跨網段通信(比如172.22.106.X和192.168.100.X實現通信)&#xff0c;通過VLAN劃分是可以滿足&#xff0c;下面分享基于弱三層交換機RTL9301方案核心模塊SW-24G4F-301EM配置方法&#xff01; 1. 一般結合交換機的應用場景&a…

什么是高防服務器?如何進行防御?

高防服務器是指能為用戶提供防御網絡攻擊&#xff0c;是主要針對DDOS等流量型攻擊能力的服務器&#xff0c;通過部署專業的硬件設備與軟件系統&#xff0c;具備高帶寬、大流量清洗能力&#xff0c;能有效抵御各類惡意流量沖擊&#xff0c;確保服務器穩定運行&#xff0c;保障網…

SW - 增加導出STL數據中的三角面數,增加別人逆向建模的難度

文章目錄SW - 增加導出STL數據中的三角面數&#xff0c;增加別人逆向建模的難度概述筆記SW版本導出時&#xff0c;選擇STL的導出選項默認導出(精細)導出粗糙自定義導出 - 將誤差和角度改為最大自定義導出 - 將誤差,角度,三角面數改為最大備注這幾天的感想關于我不參考人家零件&…

四十一、【高級特性篇】API 文檔驅動:OpenAPI/Swagger 一鍵導入測試用例

四十一、【高級特性篇】API 文檔驅動:OpenAPI/Swagger 一鍵導入測試用例 前言 準備工作 第一部分:后端實現 - OpenAPI 解析與批量創建 API 1. 創建 OpenAPI 解析服務 2. 創建批量用例導入 API 3. 注冊新 API 路由 第二部分:前端實現 - OpenAPI 導入界面 1. 更新 `api/testca…

K8S-Service資源對象

一、概述在kubernetes中&#xff0c;pod是應用程序的載體&#xff0c;我們可以通過pod的ip來訪問應用程序&#xff0c;但是pod的ip地址不是固定的&#xff0c;這也就意味著不方便直接采用pod的ip對服務進行訪問。為了解決這個問題&#xff0c;kubernetes提供了Service資源&…

【STM32】CubeMX(十三):RT-THREAD

本篇博客描述的是 RT-Thread STM32 CubeMX 的使用方法。本文也為大家提供了基于 STM32 使用 CubeMX 添加 RT-Thread 并創建閃爍 LED 任務 的操作流程。 便于您更好的理解。 一、RT-Thread 是什么&#xff1f; RT-Thread 是一個開源、輕量級的實時操作系統&#xff0c;適用于…

基于Ubuntu22.04系統PaddleX和PaddleClas訓練推理MMAFEDB人臉表情識別數據集(詳細教程)

目錄 基于Ubuntu22.04系統PaddleX和PaddleClas訓練推理MMAFEDB人臉表情識別數據集(詳細教程) 超實用的Paddle圖像分類訓練推理教程&#xff0c;助力深度學習研究&#xff01; 1、環境準備(重要???) 構建虛擬環境 安裝PaddlePaddle 安裝PaddleX 安裝PaddleClas插件 2…

Mistral AI音頻大模型Voxtral解讀

1. 引言 傳統的語音處理系統(如OpenAI的Whisper)在ASR任務上取得了巨大成功,能將語音高精度地轉換為文本。但這只是第一步。真正的“語音理解”意味著: 內容推理:不僅知道說了什么,還能理解話語背后的含義、情感和意圖。 長篇摘要:能夠聽完一段長達數十分鐘的播客或會議…

使用Docker+WordPress部署個人博客

一、通過docker compose 自動一鍵部署WordPress 1. 準備工作 安裝 Docker 和 Docker Compose確保服務器有公網 IP&#xff08;如果需要外部訪問&#xff09;域名&#xff08;可選&#xff0c;用于綁定網站&#xff09; 2. 創建 Docker Compose 配置文件 創建一個docker-compose…

http與https配置

Web 服務詳解&#xff1a;HTTP 與 HTTPS 配置 一、HTTP 服務概述 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;是用于在網絡上傳輸網頁數據的基礎協議&#xff0c;默認使用80 端口&#xff0c;以明文形式傳輸數據。常見的 HTTP 服務軟件…

Python爬蟲實戰:研究amazon-scrapy,構建亞馬遜電商數據采集和分析系統

1 引言 1.1 研究背景 電子商務的高速發展使電商平臺成為數據價值的核心載體。亞馬遜作為全球領先的電商生態,截至 2024 年第二季度,其平臺商品總量突破 1.5 億,日均活躍用戶超 3 億,每日產生 PB 級的交易數據與用戶行為記錄。這些數據包含商品特征(價格、規格、品牌)、…

基于ERNIE 4.5的多智能體協作的自動化視頻輿情分析報告生成器

多智能體協作的自動化視頻輿情分析報告生成器 1. 項目的意義與價值 從“非結構化視頻”中挖掘“結構化洞察”的通用挑戰 在當今的數字生態中&#xff0c;視頻已成為信息傳播、知識分享和消費者意見表達的核心媒介。從企業內部的會議錄屏、技術培訓&#xff0c;到外部的市場宣傳…

Java全棧開發面試實錄:從基礎到實戰的深度解析

Java全棧開發面試實錄&#xff1a;從基礎到實戰的深度解析 面試官與應聘者的對話記錄 第一輪&#xff1a;基礎問題與項目背景 面試官&#xff08;中年男性&#xff0c;穿著整潔&#xff09;&#xff1a; 你好&#xff0c;歡迎來到我們公司。我是今天的面試官&#xff0c;可以先…

如何清除webview138、139版本軟鍵盤占用的區域

好的&#xff0c;這個問題非常具體且關鍵。在 Android System WebView 的 138 和 139 版本&#xff08;基于 Chromium 113&#xff09;的上下文中&#xff0c;“清除軟鍵盤占用的區域”通常意味著&#xff1a;在軟鍵盤收起后&#xff0c;WebView 的布局或視口沒有正確恢復&…

深度學習:卷積神經網絡(CNN)

文章目錄一、CNN 基礎認知1.1 圖像在計算機中的存儲形式1.2 圖像識別的核心需求&#xff1a;畫面不變性1.3 傳統神經網絡的局限二、CNN 核心原理&#xff1a;三大核心層與關鍵操作2.1 卷積層&#xff08;1&#xff09;什么是卷積操作&#xff1f;&#xff08;2&#xff09;卷積…

iOS 26 正式版即將發布,Flutter 完成全新 devicectl + lldb 的 Debug JIT 運行支持

在之前的 《Flutter 又雙叒叕可以在 iOS 26 的真機上 hotload》 和 《Flutter 在 iOS 真機 Debug 運行出現 Timed out *** to update》 我們聊過&#xff0c;由于 iOS 26 開始&#xff0c;Apple 正式禁止了 Debug 時 mprotect 的 RX 權限&#xff0c;導致了 Flutter 在 Debug 運…