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

Autosave file opened in WOPI for editing after an interval

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

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

为了理解代码,我在单击 WOPI iframe 中的编辑按钮时初始化了一个计时器。然后从 originalfile_id 中获取从 WOPI iframe 传递的原始文件,并使用此 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,该浏览器将在字节数组中包含已编辑文档的当前值。事实并非如此。与当前编辑的文档进行交互的唯一方法是通过 PostMessage API,它提供了相当有限的一组交互。 如果您想定期将文件存储在与 WOPI 主机存储不同的本地存储中,我建议使用 WOPI 主机的 API.