CEF4 Chromium Delphi 10.2 Tokyo - 如何处理下载对话?

CEF4 Chromium Delphi 10.2 Tokyo - how to handle download dialogue?

我是 运行 Delphi 10.2 东京,里面有 CEF4 Chromium。浏览,HTML 来源,一切正常。但我真的很希望能够下载动态创建的文件。

通常我会简单地使用 Indy,但我要下载的文件是由脚本触发的,它们没有 URL 我可以将 Indy 指向并获取它们。在 Chrome 中,文件生成和下载对话需要几秒钟。

根据 component download page at Briskbard.

,CEF4 确实支持这一点

据我了解,Chromium 对话框默认情况下是取消的,甚至不会显示,除非为其创建了特定的处理程序。翻阅 Chromium.pas,这看起来应该有所帮助:

  // ICefDownloadHandler
  procedure doOnBeforeDownload(const browser: ICefBrowser; const downloadItem: ICefDownloadItem; const suggestedName: ustring; const callback: ICefBeforeDownloadCallback); virtual;
  procedure doOnDownloadUpdated(const browser: ICefBrowser; const downloadItem: ICefDownloadItem; const callback: ICefDownloadItemCallback); virtual;

但我不知道如何处理它。

我找到的唯一资源是 CEF3 c++ API Docs,但这也没有太大帮助,因为没有示例。

非常感谢您的帮助。理想情况下,跳过对话并自动将文件下载到应用程序文件夹,不需要用户交互。

谢谢!

编辑: 根据 Victoria 的提示,我添加了两个程序,但它们没有被触发。网站显然正在准备下载,因为有加载动画,但没有任何反应。

procedure TForm1.Chromium1BeforeDownload(const browser: ICefBrowser; const downloadItem: ICefDownloadItem; const suggestedName: ustring; const callback: ICefBeforeDownloadCallback);
begin
  ShowStatusText('Download triggered!');
  callback.Cont('C:\'+suggestedName, False);
end;

procedure TForm1.Chromium1DownloadUpdated(const browser: ICefBrowser; const downloadItem: ICefDownloadItem; const callback: ICefDownloadItemCallback);
begin
  if downloadItem.IsInProgress then
    ShowStatusText('Download in progress');
  if downloadItem.IsComplete then
    ShowStatusText('Download complete');
  if downloadItem.IsCanceled then
    ShowStatusText('Download cancelled');
end;

我在这里错过了什么?

EDIT2: 仍然卡住了。这有用吗?

function TChromium.CreateClientHandler(aIsOSR : boolean) : boolean;

Victoria 在没有 "Save As" 对话框的情况下给出了继续下载的正确答案。

我只是想补充一点,callback.cont 函数中的第一个参数是下载的完整文件路径,包括文件名或留空以使用建议的名称和默认的临时目录。

如果您在登录后从网页下载文件,则必须使用 TChromium 功能。

但是,如果您从不需要登录的页面下载文件,那么您可以使用 TChromium、Indy、Windows API 或任何您喜欢的工具来下载这些文件。

编辑:确保您在目标文件夹中具有写入权限。通常不能写在app文件夹或者根目录c:\

编辑 2:再次下载 CEF4Delphi。现在 MiniBrowser 有一个简单的下载器。尝试将该文件下载到同一文件夹中,看看它是否适用于 Chrome.