重点在 启用文件下载 和 通过 JavaScript 调用 C# 生存文件:
1. 添加文件下载处理器 (DownloadHandler)
在 VueFormService 类中,添加一个实现 IDownloadHandler 接口的类,用于处理文件下载到当地。
- // 新增的 DownloadHandler 类
- public class DownloadHandler : IDownloadHandler
- {
- public void OnBeforeDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
- {
- // 设置默认保存路径(例如保存到 Downloads 文件夹)
- string savePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads", downloadItem.SuggestedFileName);
- callback.Continue(savePath, showDialog: false); // showDialog: true 会弹出保存对话框
- }
- public void OnDownloadUpdated(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
- {
- // 下载状态更新(例如进度、完成通知)
- if (downloadItem.IsComplete)
- {
- MessageBox.Show($"文件已保存到:{downloadItem.FullPath}");
- }
- }
- }
复制代码 2. 在 LoadVuePage 方法中绑定下载处理器
在初始化浏览器时,设置 DownloadHandler 属性。
- public static void LoadVuePage(VueBaseForm vueForm, string subFolder = "")
- {
- // ... 其他代码 ...
- ChromiumWebBrowser browser = new ChromiumWebBrowser(url);
- vueForm.browser = browser;
- // 添加下载处理器
- browser.DownloadHandler = new DownloadHandler(); // <-- 新增代码
- vueForm.Controls.Add(browser);
- browser.Dock = DockStyle.Fill;
- // ... 其他代码 ...
- }
复制代码 3. 添加 JavaScript 调用 C# 生存文件的功能
在 RegisterHander 方法中,注册一个供 JavaScript 调用的对象,用于直接生存文件内容。
(1) 新增 FileSaveHandler 类
- public class FileSaveHandler
- {
- public void SaveFile(string fileName, string content)
- {
- string savePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads", fileName);
- File.WriteAllText(savePath, content);
- MessageBox.Show($"文件已保存到:{savePath}");
- }
- }
复制代码 (2) 修改 RegisterHander 方法
- public static void RegisterHander(VueBaseForm vueForm)
- {
- ChromiumWebBrowser browser = vueForm.browser;
- // 注册文件保存处理器
- browser.JavascriptObjectRepository.Register("fileSaver", new FileSaveHandler(), isAsync: false, options: BindingOptions.DefaultBinder); // <-- 新增代码
- // ... 其他原有注册代码 ...
- }
复制代码 4. JavaScript 调用示例
在 Vue 页面中,通过 fileSaver 对象调用 C# 的 SaveFile 方法:
- // 示例:点击按钮保存文件
- function saveFile() {
- const content = "Hello, this is a saved file!";
- fileSaver.saveFile("example.txt", content);
- }
复制代码 完备代码整合后的修改点
修改后的 VueFormService 类
- using CefSharp;
- using CefSharp.WinForms;
- using CefSharpVue;
- using CefSharpVue.Core.Utils.Winform;
- using CefSharpVue.Hander;
- using DPI_Ter.Vue;
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Text;
- using System.Windows.Forms;
- namespace CefSharpVue
- {
- public class VueFormService
- {
- // ... 其他原有代码 ...
- public static void LoadVuePage(VueBaseForm vueForm, string subFolder = "")
- {
- // ... 其他代码 ...
- ChromiumWebBrowser browser = new ChromiumWebBrowser(url);
- vueForm.browser = browser;
- // 绑定下载处理器
- browser.DownloadHandler = new DownloadHandler(); // <-- 新增代码
- vueForm.Controls.Add(browser);
- browser.Dock = DockStyle.Fill;
- // ... 其他代码 ...
- }
- public static void RegisterHander(VueBaseForm vueForm)
- {
- ChromiumWebBrowser browser = vueForm.browser;
- // 注册文件保存处理器
- browser.JavascriptObjectRepository.Register("fileSaver", new FileSaveHandler(), isAsync: false, options: BindingOptions.DefaultBinder); // <-- 新增代码
- // ... 其他原有注册代码 ...
- }
- // ... 其他原有代码 ...
- }
- // 新增的 DownloadHandler 类
- public class DownloadHandler : IDownloadHandler
- {
- public void OnBeforeDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
- {
- string savePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads", downloadItem.SuggestedFileName);
- callback.Continue(savePath, showDialog: false);
- }
- public void OnDownloadUpdated(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
- {
- if (downloadItem.IsComplete)
- {
- MessageBox.Show($"文件已保存到:{downloadItem.FullPath}");
- }
- }
- }
- // 新增的 FileSaveHandler 类
- public class FileSaveHandler
- {
- public void SaveFile(string fileName, string content)
- {
- string savePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads", fileName);
- File.WriteAllText(savePath, content);
- MessageBox.Show($"文件已保存到:{savePath}");
- }
- }
- }
复制代码 功能阐明
- 文件下载:
- 当页面触发下载(比方 <a download> 链接或 JavaScript 下载),文件会主动生存到用户的 Downloads 文件夹。
- 通过 DownloadHandler 类控制生存路径和下载完成关照。
- JavaScript 调用 C# 生存文件:
- 在 Vue 页面中,通过 fileSaver.saveFile(fileName, content) 直接调用 C# 方法生存文本文件。
- 文件默认生存到 Downloads 文件夹,路径可自界说。
安全性提示
- 假如允许用户自界说生存路径,建议通过 FolderBrowserDialog 或 SaveFileDialog 让用户选择路径。
- 启用当地文件访问时,需谨慎处理埋伏的安全风险(比方恶意脚本写入文件)。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |