PHP接入onlyoffice实现在线编查看和编辑

我使用的是laravel框架,使用模板映射,如果使用的别的框架请使用相对于的依赖

接入 OnlyOffice 的过程可能会因为具体的场景而有所不同,但通常的步骤是

注册 OnlyOffice 帐号: 如果你还没有 OnlyOffice 的帐号,你需要先注册一个。这个帐号将用于管理你的文档和配置 OnlyOffice 的功能。

安装 OnlyOffice 服务器: 你需要安装 OnlyOffice 服务器以便将其集成到你的应用程序中。OnlyOffice 提供了一些不同的产品,包括 OnlyOffice Docs Community Edition(开源免费版)和商业版。你可以根据自己的需求选择适合的版本进行安装。

配置 OnlyOffice 服务器: 安装完成后,你需要进行一些基本的配置,如设置访问权限、域名配置等。

集成 OnlyOffice 到你的应用程序: 这可能需要编写一些代码来将 OnlyOffice 编辑器嵌入到你的应用程序中。OnlyOffice 提供了一些 API 和 SDK,可以帮助你在你的应用程序中集成 OnlyOffice 功能。

Composer安装依赖 onlyoffice新版使用的jwt需要安装扩展

composer require firebase/php-jwt

onlyoffice 部署

参考已有博客部署onlyoffice,获取onlyoffice令牌,传送门如下

https://blog.youkuaiyun.com/txyllyyj/article/details/127316360

php操作OnlyOffice 编辑和查看

控制器方法,这里需要注意你传的payload要和前端传值相同不然token会验证不过

    public function edit(Request $request)
    {
        //文件路径
        $path = 'test.docx';
        //获取文件后缀
        $file_extension = pathinfo($path, PATHINFO_EXTENSION);
        $documentType = null;
        //根据不同的文件后缀设置对应打开文档的类别
        if ($file_extension == 'doc' || $file_extension == 'docx') $documentType = 'text';
        if ($file_extension == 'xls' || $file_extension == 'xlsx') $documentType = 'spreadsheet';
        if ($file_extension == 'ppt' || $file_extension == 'pptx') $documentType = 'presentation';

        $officeKey = 'onlyoffice的令牌';
        $url = $path;
        $lastCommaPosition = strrpos($path, "/"); // 获取最后一个逗号的位置
        $result = substr($path, $lastCommaPosition + 1); // 截取逗号后面的字符
        $payload['document'] = [
            "fileType" => $file_extension,
            "key" => $result,
            "title" => $file->filename,
            "url" => $url,
            "permissions" => ["edit" => true],
        ];
        $payload['documentType'] = $documentType;

        $urlParams = http_build_query($request->all());
        $callbackUrl = env('onlyoffice服务器地址') . '/onlyOffice/callbackUrl?' . $urlParams . '&arrKey=' . $arr_key;
        $payload['editorConfig'] = [
            "callbackUrl" => $callbackUrl,
            "lang" => 'zh-CN',
            "mode" => 'edit',
            "autosave" => false,
        ];
        $token = \Firebase\JWT\JWT::encode($payload, $officeKey, 'HS256');
        return view('office.edit', compact('token', 'file', 'callbackUrl', 'url', 'documentType','result','file_extension'));
    }

下面是view文件,注意预览模式和编辑模式配置项是不相同,如果发现文件打不开看看OnlyOffice是否能访问到文件路径

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>在线编辑office</title>
</head>
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
<body style="height: 100vh;width: 100vw; margin: 0;">
<div id="placeholder"></div>
<script type="text/javascript" src="{{env('这里是自己部署的onlyoffice域名或者ip地址')}}/web-apps/apps/api/documents/api.js"></script>

<script type="text/javascript">
    //判断用户是否编辑模式进入  编辑模式进入需要传入文件回调地址
    @if($editModel)
        window.docEditor = new DocsAPI.DocEditor("placeholder",
        {
            "document": {
                "fileType": '{{$fileType}}',
                "key": '{{$randKey}}',
                "title": '{{$title}}',
                "url": '{{$visibleUrl}}'
            },
            "documentType": '{{$documentType}}',
            "editorConfig": {
                "lang": "zh-CN",
                "callbackUrl": '{{$saveCallback}}', //文件回调地址
            },
            "height": "100%",
            "width": "100%"
        });
    //预览模式
    @else
        window.docEditor = new DocsAPI.DocEditor("placeholder",
        {
            "document": {
                "fileType": '{{$fileType}}',
                "key": '{{$randKey}}',
                "title": '{{$title}}',
                "url": '{{$visibleUrl}}'
            },
            "documentType": '{{$documentType}}',
            "editorConfig": {
                "mode": "view",
                "lang": "zh-CN"
            },
            "lang":"zh-CN",
            "height": "100%",
            "width": "100%"
        });
    @endif
</script>
</body>
</html>

回调方法,OnlyOffice默认是修改后十五秒,或者保存才会调用回调接口

    public function saveOfficeDoc(Request $request)
    {
        try {
            if (($body_stream = file_get_contents("php://input")) === FALSE) {
                echo "Bad Request";
            }
            $data = json_decode($body_stream, TRUE);
            if (!empty($data)) {
                if ($data["status"] == 2) {
                    $downloadUri = $data["url"];
                    $extension = $data['filetype'];
                    if (($new_data = file_get_contents($downloadUri)) === FALSE) {
                        echo "Bad Response";
                    } else {
                        // 文件保存地址
                        $folder_name = "uploads/" . date("Ym/d", time());
                        if (!is_dir($folder_name)) {
                            mkdir($folder_name, 0777, true);
                        }
                        $filename = time() . '_' . rand(111111,777777) . '.' . $extension;
                        //保存后的文件地址
                        $origin = $folder_name . '/' . $filename;
                        file_put_contents($origin, $new_data, LOCK_EX);
                        //可以写保存后的逻辑,参数是get传参
                        
                    }
                }
            }
        } catch (\Exception $exception) {
            file_put_contents('onlyoffice_error.txt', $exception->getMessage());
        }
        //这个不管是否成功都需要返回这个json串不然onlyoffice会报错
        echo "{\"error\":0}";
    }

之后打开对应的在线编辑

在这里插入图片描述

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BIMCC筑云

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

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

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

打赏作者

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

抵扣说明:

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

余额充值