Файл автосохранения открывается в WOPI для редактирования через некоторое время

Я хочу реализовать функционал, сохраняющий открытый в 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


person ak_sing    schedule 04.03.2021    source источник
comment
Почему вы, возможно, хотите сделать что-то подобное?   -  person rocky    schedule 21.03.2021
comment
спасибо за ваш ответ @rocky. На самом деле Office Online занимает много времени при автоматическом сохранении, и даже после того, как он показывает сохраненное в своем пользовательском интерфейсе, иногда он не вызывает конечную точку Putfile мгновенно, и для вызова конечной точки Putfile требуется 15-30 секунд.   -  person ak_sing    schedule 22.03.2021
comment
В результате много раз пользователь не видит сделанные им изменения в режиме редактирования, если сразу открывает режим просмотра. Любая идея, что вызывает такое поведение и как я могу это решить.   -  person ak_sing    schedule 22.03.2021
comment
вы должны были начать свой вопрос с этого :) У меня сложилось впечатление, что когда вы выходите из режима редактирования, все изменения сбрасываются и сохраняются. Не могли бы вы лучше описать сценарий? Один и тот же пользователь открывает один и тот же файл для просмотра? В том же окне (например, через imgur.com/hbKoiEx) или в новом? Вы используете Office Online Server или Office Online 365?   -  person rocky    schedule 25.03.2021
comment
@rocky Я использую Office Online Server. Много раз, когда пользователь вносит изменения, а в пользовательском интерфейсе режима редактирования отображается сообщение «Сохранено», тот же пользователь не может увидеть эти изменения, если сразу же открывает вкладку просмотра.   -  person ak_sing    schedule 26.03.2021
comment
Это также происходит, когда пользовательский интерфейс режима редактирования закрывается, а затем снова открывается для просмотра? Я думаю, что данные иногда не сбрасываются, пока вы не закроете окно (или не подождите достаточно долго). попробуйте сначала закрыть окно редактирования, а затем открыть документ для просмотра.   -  person rocky    schedule 23.05.2021


Ответы (1)


То, что вы описываете, потребует от клиента WOPI (Office Online) предоставления какого-либо API-интерфейса браузера, который будет содержать текущее значение отредактированного документа в массиве байтов. Это не так. Единственный способ взаимодействия с текущим редактируемым документом — через PostMessage. API, который предлагает довольно ограниченный набор взаимодействий. Если вы хотите периодически хранить файл в локальном хранилище, отличном от хранилища хоста WOPI, я бы рекомендовал использовать API хоста WOPI.

person rocky    schedule 20.03.2021