推荐使用官网原版镜像)
发布时间:2025-06-24 19:35:00 作者:北方职教升学中心 阅读量:274
中文文档:[https://api.onlyoffice.com/zh/editors/basic](https://api.onlyoffice.com/zh/editors/basic)
1. 搭建私有的OnlyOffice的服务
搭建过程这里就不进行涉猎了,建议使用docker进行搭建,下载官方镜像包即可,(现在dockerhub被墙,自行解决,不建议自己再次打包,因为我在尝试的时候总是出现莫名奇妙的问题可能是我的问题。推荐使用官网原版镜像)。app.js 是核心js文件- only office 我只使用他的一个编辑的功能(这是一个核心,就是编辑文件,文件的来源和存储与它无关)
- 被编辑的文件从哪里获取?从 config 对象中的配置获取,这里就需要自行实现。
@Operation(summary ="文件编辑之后的回调")@Parameters({@Parameter(name ="fileId",description ="文件的ID",in =ParameterIn.PATH)})@PostMapping("/edit/callback/{fileId}")publicvoideditCallBack(@PathVariableStringfileId,HttpServletRequestrequest,HttpServletResponseresponse){try{PrintWriterwriter =response.getWriter();Stringbody;try{Scannerscanner =newScanner(request.getInputStream());scanner.useDelimiter("\A");body =scanner.hasNext()?scanner.next():"";scanner.close();}catch(Exceptionex){writer.write("get request.getInputStream error:"+ex.getMessage());return;}if(body.isEmpty()){writer.write("empty request.getInputStream");return;}JSONObjectjsonObj =JSON.parseObject(body);intstatus =(Integer)jsonObj.get("status");log.debug("================文件编辑获取到的参数是:{}",JSON.toJSONString(jsonObj));intsaved =0;if(List.of(2,3,6).contains(status)){StringdownloadUri =(String)jsonObj.get("url");log.debug("================文件进行保存处理,需要保存的状态值是:{},可以获取到文件的路径是:{}",status,downloadUri);try{URLurl =newURL(downloadUri);// 根据文件下载地址来获取编辑后的文件流HttpURLConnectionconnection =(HttpURLConnection)url.openConnection();InputStreamstream =connection.getInputStream();if(stream ==null){thrownewException("Stream is null");}// TODO 根据文件的唯一标识获取数据库中文件记录EtmfFileInfofileInfo =fileInfoOpt.getById(fileId);// TODO 根据文件流创建一个文件FilesavedFile =newFile(fileInfo.getFileName());try(FileOutputStreamout =newFileOutputStream(savedFile)){intread;finalbyte[]bytes =newbyte[1024];while((read =stream.read(bytes))!=-1){out.write(bytes,0,read);}out.flush();}// TODO 根据文件上传到 MINIO中booleanb =smoMinIoUtils.uploadFile(fileInfo.getFileUrl(),savedFile);log.info("编辑文件后,文件上传状态:{},上传的文件是:{},Id是:{}",b,fileInfo.getFileName(),fileId);savedFile.delete();connection.disconnect();}catch(Exceptionex){saved =1;ex.printStackTrace();}finally{// 正常保存的时候剔除掉redis缓存if(status ==TWO){redisUtil.hdel(RedisName.ONLY_OFFICE_FILE_KYE,fileId);}}}writer.write("{"error":"+saved +"}");writer.flush();writer.close();log.debug("======================编辑完成--------------返回值是:{}","{"error":"+saved +"}");}catch(IOExceptione){e.printStackTrace();thrownewSmoGlobalException(CustomExceptionType.OTHER_ERROR);}}
3. 总结
文件的在线编辑主要就是依托与onlyoffice实现的,而编辑器的配置是通过我们的接口来定义的,接口中的配置可以自由的定义编辑器的文件类型,窗口大小,文件来源,回调地址,保存类型等等。
- 4.2 TOKEN是可以可选项,建议一开始不要使用,后面有需要的时候再去添加。
文件编辑后的处理都是在回调中处理的,最好先看一下文档的回调写法。api比较全面,还有中文的文档。唯一遗憾的就是效率比较低,在使用私有对象存储的时候存在延迟。
2. SpringBoot进行交互
2.1 环境
java: 17
boot: 3.0.5
页面:一个h5页面即可
需要的其他依赖
<!-- ... 其他的依赖自行添加即可,不重要,比如 fastjson2,jackson 等 --><!-- 这个JAR 主要的作用是与OnlyOffice交互的时候生成token使用的 --><dependency><groupId>com.inversoft</groupId><artifactId>prime-jwt</artifactId><version>1.3.1</version></dependency>
2.2 我们的流程
我们使用一个 H5 页面即可,页面通过加载一个 app.js 。