自动保存文件在 WOPI 中打开以在间隔后进行编辑

问题描述

我想实现一个功能,在检查文件是否进行了一些更改后,每 5 秒保存一次在 WOPI 中打开的文件(.docx、.pptx、.xlsx)以在本地存储中进行编辑。稍后将保存在数据库中(点击提交按钮后)。

我做了一些研究,发现我们可以在 c# 中使用计时器来实现这一点,但是如何在计时器函数中以字节为单位获取 WOPI 编辑器的内容以比较它的变化。

为了理解代码,我在 WOPI iframe 中的编辑按钮被点击时初始化了一个计时器。然后从 WOPI iframe 传递的 originalfile_id获取原始文件,并使用此 id 从本地存储中获取文件。然后将其内容与在WOPI中打开进行编辑的文件内容进行比较,如果字节数组不同,则表示进行了更改,因此我将文件保存为最新更改。

自动保存机制每 5 秒运行一次,并检查是否进行了更改,然后仅保存文件,其他任何操作直到发生更改。当用户关闭编辑器或提交更改时,计时器停止。

public class FileSave
{
    private static System.Timers.Timer aTimer;
    public static string _originalfile_id;
    public static String _Id;

    public FileSave(string originalfile_id)
    {
        _originalfile_id = originalfile_id;

    // Create a timer with a two-second interval.
        aTimer = new Timer(5000);
       
        aTimer.Elapsed += OnTimedEvent;
        aTimer.AutoReset = true;
        aTimer.Enabled = true;
    }

    public static void OnTimedEvent(object sender,ElapsedEventArgs e)
    {
        // Ensure the timer is stopped so we don't try saving multiple times at once
        aTimer.Stop();
        SaveFileLocally();

        //Restart Timer
        aTimer.Start();
    }


    public static void SaveFileLocally()
    {
        
        FileInfo originalfile = new FileInfo(_originalfile_id);
        byte[] originalcontent = GetFileContent(originalfile);
        
        //the content in WOPI Editor
        byte[] editedcontent = WOPITextBox.content
        
        if (originalcontent.Length == editedcontent.Length)
        {
            for (int i = 0; i < originalcontent.Length; i++)
            {
                if (originalcontent[i] != editedcontent[i])
                {
                    SaveLocally(_Id,editedcontent);

                    return;
                }
            }
            return;
        }
        SaveLocally(_Id,editedcontent);
        return;
    }

如何在 WOPI 中打开此内容以进行如下编辑:byte[] editedcontent = WOPITextBox.content

解决方法

您所描述的内容需要 WOPI 客户端 (Office Online) 公开某种浏览器 API,该 API 将包含字节数组中已编辑文档的当前值。事实并非如此。与当前编辑的文档进行交互的唯一方法是通过 PostMessage API,它提供了相当有限的一组交互。 如果您想定期将文件存储在与 WOPI Host 存储不同的本地存储中,我建议您使用 WOPI Host 的 API。