自动保存在 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.
我想实现一个功能,在检查对文件进行了一些更改后,每隔 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.