User Tools

Site Tools


study:cs-webbrowser:20250624-001:index

C# CefSharp 如何儲存點擊頁面下載之檔案 (2025-06-24)

  • 在 C# 中使用 CefSharp 來處理網頁下載時,可以通過監聽下載事件來儲存用戶點擊的下載檔案。以下是如何實現這個功能的步驟

步驟 1: 安裝 CEFSharp

  • 首先,確保已經在 C# 項目中安裝了 CefSharp
  • 可以使用 NuGet 包管理器進行安裝:
    Install-Package CefSharp.WinForms

步驟 2: 設定 CEFSharp 控制項

  • 在 WinForms 應用中,添加 ChromiumWebBrowser 控制項,並設置一些屬性來處理下載

步驟 3: 監聽下載事件

  • 需要訂閱 DownloadHandler 事件來捕獲下載請求
  • 以下是一個範例代碼,展示如何儲存下載的檔案:
    using System;
    using System.IO;
    using System.Windows.Forms;
    using CefSharp;
    using CefSharp.WinForms;
    
    public class MainForm : Form
    {
        private ChromiumWebBrowser browser;
    
        public MainForm()
        {
            InitializeComponent();
            InitializeBrowser();
        }
    
        private void InitializeBrowser()
        {
            // 初始化 CEFSharp
            Cef.Initialize(new CefSettings());
    
            // 創建 ChromiumWebBrowser 控制項
            browser = new ChromiumWebBrowser("https://example.com");
            this.Controls.Add(browser);
            browser.Dock = DockStyle.Fill;
    
            // 設置下載處理器
            browser.DownloadHandler = new DownloadHandler();
        }
    
        public class DownloadHandler : IDownloadHandler
        {
            public void OnBeforeDownload(IWebBrowser browserControl, IBrowser browser, IFrame frame, string url, string suggestedName, string mimeType, bool isNewDownload, IBeforeDownloadCallback callback)
            {
                // 指定下載的保存路徑
                string downloadPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), suggestedName);
    
                // 開始下載
                callback.Continue(downloadPath, showDialog: false);
            }
    
            public void OnDownloadUpdated(IWebBrowser browserControl, IBrowser browser, IFrame frame, string url, IDownloadItem downloadItem, IDownloadCallback callback)
            {
                // 可以在這裡處理下載狀態更新
                if (downloadItem.IsComplete)
                {
                    MessageBox.Show("下載完成: " + downloadItem.FullPath);
                }
            }
        }
    }
  • 說明
    • 初始化 CEFSharp: 在 InitializeBrowser 方法中初始化 CEFSharp 並創建 ChromiumWebBrowser 控制項
    • 設置下載處理器: 在 DownloadHandler 類中,實現了 IDownloadHandler 介面,並定義了 OnBeforeDownload 和 OnDownloadUpdated 方法
    • OnBeforeDownload: 這個方法在下載開始之前被調用。可以在這裡指定文件的保存路徑,並調用 callback.Continue 開始下載
    • OnDownloadUpdated: 這個方法在下載狀態更新時被調用,可以在這裡處理下載進度或完成的通知
  • 總結
    • 這段代碼展示了如何在 CEFSharp 中處理下載事件並將文件保存到指定位置
    • 可以根據需要調整保存路徑或其他下載選項

修正

  • using CefSharp;
    using System;
    using System.IO;
    
    public class DownloadHandler : IDownloadHandler
    {
        private readonly string _downloadFolder;
    
        public DownloadHandler(string downloadFolder)
        {
            // 設定儲存的資料夾
            _downloadFolder = downloadFolder;
        }
    
        public void OnBeforeDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
        {
            // 確保資料夾存在
            if (!Directory.Exists(_downloadFolder))
            {
                Directory.CreateDirectory(_downloadFolder);
            }
    
            // 指定下載的保存路徑
            string downloadPath = Path.Combine(_downloadFolder, downloadItem.SuggestedFileName);
    
            // 開始下載
            callback.Continue(downloadPath, showDialog: false);
        }
    
        public void OnDownloadUpdated(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
        {
            // 在這裡處理下載狀態更新
            if (downloadItem.IsComplete)
            {
                // 獲取下載的完整路徑和文件名
                string filePath = downloadItem.FullPath;
                string fileName = Path.GetFileName(filePath);
    
                // 這裡可以使用其他方式通知用戶,例如使用日誌或其他 UI 元素
                Console.WriteLine($"下載完成: {filePath}");
                Console.WriteLine($"文件名: {fileName}");
            }
        }
    }
  • 主要變更
    • 指定儲存的資料夾: 在 DownloadHandler 的建構函數中接收一個資料夾路徑,並在 OnBeforeDownload 方法中使用這個路徑來指定下載的儲存位置。
    • 檢查和創建資料夾: 在開始下載之前,檢查指定的資料夾是否存在,如果不存在則創建它
    • 獲取文件路徑和文件名: 在 OnDownloadUpdated 方法中,可以使用 downloadItem.FullPath 獲取完整的文件路徑,並使用 Path.GetFileName 獲取文件名。
  • 使用範例
    • 當實例化 DownloadHandler 時,傳遞想要的下載資料夾路徑:
      var downloadHandler = new DownloadHandler(@"C:\Your\Desired\Download\Folder");
  • 總結
    • 這個實現允許指定下載的資料夾,並在下載完成時獲取文件的完整路徑和文件名
    • 確保應用程序有權限寫入指定的資料夾,否則可能會導致下載失敗

study/cs-webbrowser/20250624-001/index.txt · Last modified: 2025/06/24 17:43 by jethro