web-dev-qa-db-fra.com

Télécharger le fichier avec cefsharp winforms

J'essaie de télécharger un fichier (image, fichier audio ou autre) à partir de mon application à l'aide de cefsharp winforms. J'ai lu n'importe quel autre article, mais rien ne semble fonctionner. Avez-vous un exemple de code à me montrer pour implémenter le téléchargeur de cefsharp?

Bien sûr, lorsque j'essaie maintenant de télécharger des fichiers, rien ne se passe.

Merci

15
crasholino

Pour résoudre ce problème, téléchargez simplement la classe DownloadHandler.cs trouvée ici.

Après cela, importez-le dans votre projet Visual Studio et ajoutez cette ligne au code du formulaire principal: MyBrowser.DownloadHandler = new DownloadHandler(); et ajoutez ceci en haut du code: using CefSharp.Example; Essayez ensuite de télécharger quelque chose à partir de votre navigateur, et cela devrait fonctionner!

13
Lorinet Gaming

Après 2 jours, finalement je l'ai fait. Pour les personnes qui ont le même problème, voici la solution simple. Si vous utilisez MinimalExample, vous devez télécharger l'exemple Cefsharp (cefsharp-master) décompressez-le et procédez comme suit:

  1. Faites un clic droit sur votre projet -> Ajouter un élément existant
  2. Naviguez dans cefsharp-master -> CefSharp.example -> Sélectionnez DownloadHandler.cs
  3. Allez dans votre classe BrowserForm.cs et tapez ceci:

    browser.DownloadHandler = new DownloadHandler ();

  4. Terminé!



DownloadHandler.cs

// Copyright © 2013 The CefSharp Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.

using System;

namespace CefSharp.Example.Handlers
{
    public class DownloadHandler : IDownloadHandler
    {
        public event EventHandler<DownloadItem> OnBeforeDownloadFired;

        public event EventHandler<DownloadItem> OnDownloadUpdatedFired;

        public void OnBeforeDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
        {
            OnBeforeDownloadFired?.Invoke(this, downloadItem);

            if (!callback.IsDisposed)
            {
                using (callback)
                {
                    callback.Continue(downloadItem.SuggestedFileName, showDialog: true);
                }
            }
        }

        public void OnDownloadUpdated(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
        {
            OnDownloadUpdatedFired?.Invoke(this, downloadItem);
        }
    }
}
12
crasholino

J'inclus ce qui suit car l'implémentation de OnBeforeDownloadFired () n'est pas montrée dans de nombreux exemples en ligne sur la façon d'utiliser la classe DownloadHandler, et elle est absente des DownloadHandler.cs cités.

Cela a aidé à résoudre un problème persistant avec le téléchargement de fichiers (par exemple .mobi ebook) si le lien de téléchargement avait la cible "_blank". S'il n'y avait pas de cible, une boîte de dialogue de téléchargement a été déclenchée. Avec une cible _blank, j'ai dû supprimer une fenêtre contextuelle et ouvrir un nouvel onglet personnalisé dans mon navigateur, mais lorsque cela s'est produit, une boîte de dialogue de téléchargement n'a pas été déclenchée.

Je pense que c'est vrai. J'espère que cela vous aidera, ou du moins vous donnera un début:

DownloadHandler downer = new DownloadHandler(this);
browser.DownloadHandler = downer;
downer.OnBeforeDownloadFired += OnBeforeDownloadFired;
downer.OnDownloadUpdatedFired += OnDownloadUpdatedFired;

private void OnBeforeDownloadFired(object sender, DownloadItem e)
{
    this.UpdateDownloadAction("OnBeforeDownload", e);
}

private void OnDownloadUpdatedFired(object sender, DownloadItem e)
{
    this.UpdateDownloadAction("OnDownloadUpdated", e);
}

private void UpdateDownloadAction(string downloadAction, DownloadItem downloadItem)
{
    /*
    this.Dispatcher.Invoke(() =>
    {
        var viewModel = (BrowserTabViewModel)this.DataContext;
        viewModel.LastDownloadAction = downloadAction;
        viewModel.DownloadItem = downloadItem;
    });
    */
}

// ...

public class DownloadHandler : IDownloadHandler
{
    public event EventHandler<DownloadItem> OnBeforeDownloadFired;

    public event EventHandler<DownloadItem> OnDownloadUpdatedFired;

    MainForm mainForm;

    public DownloadHandler(MainForm form)
    {
        mainForm = form;
    }

    public void OnBeforeDownload(IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
    {
        var handler = OnBeforeDownloadFired;
        if (handler != null)
        {
            handler(this, downloadItem);
        }

        if (!callback.IsDisposed)
        {
            using (callback)
            {
                callback.Continue(downloadItem.SuggestedFileName, showDialog: true);
            }
        }
    }

    public void OnDownloadUpdated(IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
    {
        var handler = OnDownloadUpdatedFired;
        if (handler != null)
        {
            handler(this, downloadItem);
        }
    }
}

// ...
8
Eric Twose