CefSharp 文件下载和生存功能-监听前端事件

打印 上一主题 下一主题

主题 1031|帖子 1031|积分 3093

重点在 启用文件下载通过 JavaScript 调用 C# 生存文件

1. 添加文件下载处理器 (DownloadHandler)

在 VueFormService 类中,添加一个实现 IDownloadHandler 接口的类,用于处理文件下载到当地。
  1. // 新增的 DownloadHandler 类
  2. public class DownloadHandler : IDownloadHandler
  3. {
  4.     public void OnBeforeDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
  5.     {
  6.         // 设置默认保存路径(例如保存到 Downloads 文件夹)
  7.         string savePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads", downloadItem.SuggestedFileName);
  8.         callback.Continue(savePath, showDialog: false); // showDialog: true 会弹出保存对话框
  9.     }
  10.     public void OnDownloadUpdated(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
  11.     {
  12.         // 下载状态更新(例如进度、完成通知)
  13.         if (downloadItem.IsComplete)
  14.         {
  15.             MessageBox.Show($"文件已保存到:{downloadItem.FullPath}");
  16.         }
  17.     }
  18. }
复制代码

2. 在 LoadVuePage 方法中绑定下载处理器

在初始化浏览器时,设置 DownloadHandler 属性。
  1. public static void LoadVuePage(VueBaseForm vueForm, string subFolder = "")
  2. {
  3.     // ... 其他代码 ...
  4.     ChromiumWebBrowser browser = new ChromiumWebBrowser(url);
  5.     vueForm.browser = browser;
  6.     // 添加下载处理器
  7.     browser.DownloadHandler = new DownloadHandler();  // <-- 新增代码
  8.     vueForm.Controls.Add(browser);
  9.     browser.Dock = DockStyle.Fill;
  10.     // ... 其他代码 ...
  11. }
复制代码

3. 添加 JavaScript 调用 C# 生存文件的功能

在 RegisterHander 方法中,注册一个供 JavaScript 调用的对象,用于直接生存文件内容。
(1) 新增 FileSaveHandler 类

  1. public class FileSaveHandler
  2. {
  3.     public void SaveFile(string fileName, string content)
  4.     {
  5.         string savePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads", fileName);
  6.         File.WriteAllText(savePath, content);
  7.         MessageBox.Show($"文件已保存到:{savePath}");
  8.     }
  9. }
复制代码
(2) 修改 RegisterHander 方法

  1. public static void RegisterHander(VueBaseForm vueForm)
  2. {
  3.     ChromiumWebBrowser browser = vueForm.browser;
  4.     // 注册文件保存处理器
  5.     browser.JavascriptObjectRepository.Register("fileSaver", new FileSaveHandler(), isAsync: false, options: BindingOptions.DefaultBinder);  // <-- 新增代码
  6.     // ... 其他原有注册代码 ...
  7. }
复制代码

4. JavaScript 调用示例

在 Vue 页面中,通过 fileSaver 对象调用 C# 的 SaveFile 方法:
  1. // 示例:点击按钮保存文件
  2. function saveFile() {
  3.     const content = "Hello, this is a saved file!";
  4.     fileSaver.saveFile("example.txt", content);
  5. }
复制代码

完备代码整合后的修改点

修改后的 VueFormService 类

  1. using CefSharp;
  2. using CefSharp.WinForms;
  3. using CefSharpVue;
  4. using CefSharpVue.Core.Utils.Winform;
  5. using CefSharpVue.Hander;
  6. using DPI_Ter.Vue;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Diagnostics;
  10. using System.IO;
  11. using System.Text;
  12. using System.Windows.Forms;
  13. namespace CefSharpVue
  14. {
  15.     public class VueFormService
  16.     {
  17.         // ... 其他原有代码 ...
  18.         public static void LoadVuePage(VueBaseForm vueForm, string subFolder = "")
  19.         {
  20.             // ... 其他代码 ...
  21.             ChromiumWebBrowser browser = new ChromiumWebBrowser(url);
  22.             vueForm.browser = browser;
  23.             // 绑定下载处理器
  24.             browser.DownloadHandler = new DownloadHandler();  // <-- 新增代码
  25.             vueForm.Controls.Add(browser);
  26.             browser.Dock = DockStyle.Fill;
  27.             // ... 其他代码 ...
  28.         }
  29.         public static void RegisterHander(VueBaseForm vueForm)
  30.         {
  31.             ChromiumWebBrowser browser = vueForm.browser;
  32.             // 注册文件保存处理器
  33.             browser.JavascriptObjectRepository.Register("fileSaver", new FileSaveHandler(), isAsync: false, options: BindingOptions.DefaultBinder);  // <-- 新增代码
  34.             // ... 其他原有注册代码 ...
  35.         }
  36.         // ... 其他原有代码 ...
  37.     }
  38.     // 新增的 DownloadHandler 类
  39.     public class DownloadHandler : IDownloadHandler
  40.     {
  41.         public void OnBeforeDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
  42.         {
  43.             string savePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads", downloadItem.SuggestedFileName);
  44.             callback.Continue(savePath, showDialog: false);
  45.         }
  46.         public void OnDownloadUpdated(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
  47.         {
  48.             if (downloadItem.IsComplete)
  49.             {
  50.                 MessageBox.Show($"文件已保存到:{downloadItem.FullPath}");
  51.             }
  52.         }
  53.     }
  54.     // 新增的 FileSaveHandler 类
  55.     public class FileSaveHandler
  56.     {
  57.         public void SaveFile(string fileName, string content)
  58.         {
  59.             string savePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads", fileName);
  60.             File.WriteAllText(savePath, content);
  61.             MessageBox.Show($"文件已保存到:{savePath}");
  62.         }
  63.     }
  64. }
复制代码

功能阐明


  • 文件下载

    • 当页面触发下载(比方 <a download> 链接或 JavaScript 下载),文件会主动生存到用户的 Downloads 文件夹。
    • 通过 DownloadHandler 类控制生存路径和下载完成关照。

  • JavaScript 调用 C# 生存文件

    • 在 Vue 页面中,通过 fileSaver.saveFile(fileName, content) 直接调用 C# 方法生存文本文件。
    • 文件默认生存到 Downloads 文件夹,路径可自界说。


安全性提示



  • 假如允许用户自界说生存路径,建议通过 FolderBrowserDialog 或 SaveFileDialog 让用户选择路径。
  • 启用当地文件访问时,需谨慎处理埋伏的安全风险(比方恶意脚本写入文件)。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

汕尾海湾

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表