Загрузка файлов с помощью CefSharp

Мы используем CefSharp (пакет NuGet версии 37.0.0) в приложении C# WinForms. Мы ищем способ (программно) инициировать действия по загрузке файлов. Как, если вообще, это можно сделать? Пара дополнительных мыслей:

  • У нас есть диалог загрузки файла на странице, где обычно пользователь выбирает файл. Это отлично работает, мы перехватываем вызов диалога через IDialogHandler и предоставляем файл.
  • Теперь мы хотим вызвать тот же диалог и предварительно установить файл. Хотя диалоговое окно успешно открывается из вызова «ExecuteScriptAsync», мы не можем предварительно выбрать файл. Возможно, по следующей причине: как создать /инициализировать файловый объект, используя путь к файлу html5
  • Наша следующая идея заключалась в том, чтобы диалоговое окно открывалось нормально и программно выдавало событие щелчка, чтобы браузер открывал файловое диалоговое окно (которое мы затем перехватывали с помощью IDialogHandler и предоставляли желаемый файл).
  • Попробовав этот подход, наше наблюдение выглядит следующим образом:
  • После действия пользователя (например, нажатия кнопки внутри браузера) мы можем программно «щелкнуть» кнопку ввода файла.
  • Делая то же самое из вызова, исходящего через ExecuteScriptAsync, диалоговое окно (или вызов в IDialogHandler) не появляется.

person lichtalberich    schedule 23.12.2014    source источник


Ответы (3)


Делая то же самое из вызова, исходящего через ExecuteScriptAsync, диалоговое окно (или вызов в IDialogHandler) не появляется.

Вероятно, это связано с теми же ограничениями безопасности, которые применяются к обычному JavaScript: диалоговое окно файла в Chrome

Я думаю, вам нужно будет:

  1. In JavaScript:
    1. Scroll the file upload button into view, Element.scrollIntoView()
    2. Рассчитать координаты кнопки загрузки файла, Element.getBoundingClientRect()
    3. Верните координаты в C#.
  2. In C#:
    1. Programmatically send a mouse click to the co-ordinates (see this question)
person Yoshi    schedule 29.12.2014
comment
Это определенно очевидный способ сделать это - спасибо, что указал на это, Йоши! Сейчас мы решили ее немного по-другому. Мы позволяем пользователю щелкнуть нашу последнюю кнопку «Сохранить» в html-форме. Но в этом особом случае мы открываем диалоговое окно открытия файла, которое работает, потому что оно возникло в результате действия пользователя, которое мы затем перехватываем из C# и устанавливаем файл соответствующим образом. Затем мы снова вызываем функцию сохранения прямо из того же обработчика событий C#, который, наконец, запускает логику сохранения/загрузки. Круто, это тесное взаимодействие между javascript/.NET. - person lichtalberich; 29.12.2014

В файле TempFileDialogHandler примера проекта CefSharp есть пример этого.

    public class TempFileDialogHandler : IDialogHandler
    {
        public bool OnFileDialog(IWebBrowser browserControl, IBrowser browser, CefFileDialogMode mode, string title, string defaultFilePath, List<string> acceptFilters, int selectedAcceptFilter, IFileDialogCallback callback)
        {
            callback.Continue(selectedAcceptFilter, new List<string> { Path.GetRandomFileName() });

            return true;
        }
    }


Замените Path.GetRandomFileName() на путь к файлу, а затем прикрепите обработчик к браузеру следующим образом:

browser.DialogHandler = new TempFileDialogHandler();
person Alberto Rojas    schedule 10.01.2018

Я могу ошибаться, но этого также можно добиться, используя плагины загрузки файлов jquery, а не делая это самостоятельно.

Загрузить Ajax Загрузить

person Akshay    schedule 08.11.2016