onlyoffice使用,前端+java

一、前端

onlyoffice使用

页面引用
<head>
	<script type="text/javascript" src="http://192.168.58.138:9001/web-apps/apps/api/documents/api.js"></script>
</head>
<body>
	<div id="placeholder"></div>
</body>
加载文档
var docEditor = new DocsAPI.DocEditor("placeholder", {//placeholder为要放入的位置
				"document" : {
					"fileType": "docx",//文件类型
					"key": "EF12KFF",//docserver会通过key读取缓存,如果文档进行修改要修改key值
					"title": "测试文档",//显示文档标题
					"url": "http://192.168.0.1:8080/test/onlyoffice/onlyofficeLoad"//可以为静态地址,也可为方法地址
				},
				"documentType": "text",//onlyoffice可打开word、excel、ppt==
				"editorConfig": {
					"callbackUrl": "",//回调地址,一定要保证docserver可以请求到,否则开不开文件
					"lang": "zh-CN",
					"mode": "view",//只读view,编辑edit
				"permissions":{
					"comment": false,//是否可以评论
					"download": false,//是否可以下载
					"edit": true,//是否可以编辑
					"fillForms": true,//
					"print": false,//是否可以打印
					"review": true//
				}
			});
后台方法

url:获取文件的请求,使用以下方法返回要打开的文件流

@RequestMapping(value = "/onlyofficeLoad")
@ResponseBody
public void onlyofficeLoad(HttpServletRequest request, HttpServletResponse response){
	response.reset();
   	fileName = URLEncoder.encode(fileName, "UTF-8");
    fileName = fileName.replaceAll("\\+", "%20");

    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"; " + "filename*=UTF-8''" + fileName);
    response.setCharacterEncoding("UTF-8");
    response.setContentType("application/octet-stream");//注意类型一定要是octet-stream
    response.setContentLength(inputStream.available());
    OutputStream sos = response.getOutputStream();
    byte[] bytes = new byte[1024 * 512];
    int i = -1;
    while ((i = inputStream.read(bytes)) != -1){
    	sos.write(bytes, 0, i);
    }
    sos.flush();
    StreamUtils.closeStream(inputStream);
}

callbackUrl:当文件打开或关闭都会调用改方法(文件关闭会在10秒后发送请求)

@RequestMapping(value = "/generateReport", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
@ResponseBody
public void generateReport(HttpServletRequest request, HttpServletResponse response){
PrintWriter writer = null;
	try{
        String body = "";
        try{
            writer = response.getWriter();
            Scanner scanner = new Scanner(request.getInputStream());
            scanner.useDelimiter("\\A");
            body = scanner.hasNext() ? scanner.next() : "";
            scanner.close();
        } catch (Exception ex) {
            writer.write("get request.getInputStream error:" + ex.getMessage());
            return;
        }
		if (body.isEmpty()) {
            writer.write("empty request.getInputStream");
            return;
        }

        JSONParser parser = new JSONParser();
        JSONObject jsonObj = (JSONObject) parser.parse(body);
        int status = Integer.parseInt(jsonObj.get("status").toString());
        int saved = 0;
        //statusAPI见下表
        if (status == 2 || status == 3 || status == 6) {
            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");
                }

                filePath = "";
                File fileDir = new File(filePath);
                if (!fileDir.isDirectory()){
                    fileDir.mkdirs();
                }
                File savedFile = new File(upload_file_path + filePath + fileName);
                if (savedFile.exists()) {
                    savedFile.delete();
                }
                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();
            }
        }
        writer.write("{\"error\":" + saved + "}");
        System.out.println("保存成功");
    } catch (ParseException e) {
        System.out.println("保存异常");
        writer.write("{\"error\":\"-1\"}");
        e.printStackTrace();
    }
}

注:上述代码逻辑不可改变,docserver会根据writer.write()对文件进行操作。

回调的status共有6种,仅当状态为2,3,6时会去保存文件
status
1正在编辑文件,
2文件已准备好保存,
3发生文件保存错误,
4文件已关闭且未做任何更改,
6正在编辑文档,但保存了当前文档状态,
7强制保存文档时发生错误。

————————————————
版权声明:本文为CSDN博主「学习要趁早z」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42677452/article/details/116197517

  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习要趁早z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值