问题描述
我想实现一个功能,在检查文件是否进行了一些更改后,每 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。