Я хочу реализовать функционал, сохраняющий открытый в WOPI файл (.docx, .pptx, .xlsx) для редактирования в локальном хранилище через каждые 5 секунд, предварительно проверив, что в файл внесены какие-то изменения. И позже это будет сохранено в базе данных (после нажатия кнопки отправки).
Я провел некоторое исследование и обнаружил, что мы можем добиться этого с помощью таймера в С#, но как я могу получить содержимое редактора WOPI в байтах в функции таймера, чтобы сравнить его на наличие изменений.
Для понимания кода я инициализирую таймер при нажатии кнопки редактирования в WOPI iframe. Затем получите исходный файл из originalfile_id
, переданный из iframe WOPI, и используйте этот идентификатор для извлечения файла из локального хранилища. Потом сравниваю его содержимое с содержимым файла открытого в 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