CefSharp 文件下载和生存功能-监听前端事件
重点在 启用文件下载 和 通过 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企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]