Je travaille sur un webcrawler écrit en C # à l'aide de System.Windows.Forms.WebBrowser. J'essaie de télécharger un fichier sur un site Web et d'enregistrer sur une machine locale. Plus important encore, j'aimerais que cela soit entièrement automatisé. Le téléchargement de fichier peut être démarré en cliquant sur un bouton qui appelle une fonction JavaScript qui déclenche le téléchargement affichant A "Voulez-vous ouvrir ou enregistrer ce fichier?" dialogue. Je ne veux absolument pas cliquer sur "Enregistrer sous" et saisissez le nom du fichier. p>
Je suis au courant des fonctions de téléchargement de httpwebrequest et de WebClient, mais comme le téléchargement est démarré avec un JavaScript, je connais maintenant l'URL du fichier. FYI, le JavaScript est une fonction Dopostback qui change certaines valeurs et soumet un formulaire. p>
J'ai essayé de me concentrer sur la boîte de dialogue Enregistrer sous forme de boîte de dialogue WebBrowser pour l'automatiser à partir de là sans succès. Je sais qu'il y a un moyen de forcer le téléchargement à enregistrer au lieu de demander à enregistrer ou à ouvrir en ajoutant un en-tête à la demande HTTP, mais je ne sais pas comment spécifier le fichier FilePath à télécharger. p>
4 Réponses :
Je pense que vous devez empêcher la boîte de dialogue de téléchargement de même. Ici pourrait être un moyen de faire cela: p>
Le code JavaScript provoque votre commande WebBrowser de naviguer vers une URL spécifique (que provoquerait l'apparition de la boîte de dialogue Télécharger) P> LI>
Pour empêcher le contrôle WebBrowser de naviguer sur cette URL, joignez un gestionnaire d'événements à l'événement de navigation. P> li>
Dans votre événement de navigation, vous devez analyser s'il s'agit de l'action de navigation réelle que vous voudriez arrêter (est-ce une URL de téléchargement, peut-être vérifier une extension de fichier, il doit y avoir un format reconnaissable. ). Utilisez le Webbrowsernavigatinavigatinargs.url pour le faire. P> Li>
S'il s'agit de la bonne URL, arrêtez la navigation en définissant la propriété webbrowernavigatinavigatinavigationventargs.Cancel. P> li>
Continuez le téléchargement avec les classes httpwebrequest ou webclient p> li> ul>
Regardez sur cette page pour plus d'informations sur l'événement:
http://msdn.microsoft.com/fr -us / bibliothèque / systeme.windows.forms.webbrowser.navigating.aspx p>
J'ai déjà essayé d'obtenir l'URL à l'aide d'un httpdebugger pour examiner la demande et les réponses HTTP. L'URL est exactement la même, l'une étant une demande d'obtention, l'autre étant une demande postale. J'ai aussi juste essayé votre suggestion sans chance.
Vous voudrez peut-être utiliser le contrôle WebBrowser pour aller jusqu'au bout, juste avant que le formulaire ne soit soumis puis extraire la destination post du formulaire à l'aide de DOM (obtenez une référence au corps du document HTML et de votre chemin vous rendez-vous sur former).
Une solution similaire est disponible à http: // social.msdn.microsoft.com/forums/fr/csharsgeneral/thread/d338A2C8-96DF-4CB0-B8BE-C5FBDD7C9202/?prof=required P>
Ce travail parfaitement s'il y a une URL directe, y compris le téléchargement du nom de fichier. P>
Mais parfois, une URL génère un fichier de manière dynamique. Ainsi, l'URL n'a pas de nom de fichier, mais après avoir demandé à l'URL, certains sites Web créent un fichier de manière dynamique, puis ouvrez / sauvegarder la boîte de dialogue. P>
Par exemple, un lien génère un fichier PDF à la volée. P>
Comment gérer un tel type d'URL? P>
Jetez un coup d'œil à Erika Chinchio Article sur http://www.codeproject.com/tips/659004/download-of-file-withOpen-Save-Dialog-Box P>
Bien que cela puisse répondre théoriquement à la question, Il serait préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence .
Ce code récupère le lien réel que vous souhaitez télécharger en utilisant le navigateur Web. Ce code devra être modifié pour votre action spécifique. em> la partie importante est celle-ci un champ DocumentLinkurl code> qui sera utilisé ci-dessous. P>
[System.Runtime.InteropServices.DllImport("wininet.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
static extern bool InternetGetCookieEx(string pchURL, string pchCookieName,
System.Text.StringBuilder pchCookieData, ref uint pcchCookieData, int dwFlags, IntPtr lpReserved);
const int INTERNET_COOKIE_HTTPONLY = 0x00002000;
private string GetGlobalCookies(string uri)
{
uint uiDataSize = 2048;
var sbCookieData = new System.Text.StringBuilder((int)uiDataSize);
if (InternetGetCookieEx(uri, null, sbCookieData, ref uiDataSize,
INTERNET_COOKIE_HTTPONLY, IntPtr.Zero)
&&
sbCookieData.Length > 0)
{
return sbCookieData.ToString().Replace(";", ",");
}
return null;
}
Avez-vous une solution à votre dernier problème, comment télécharger le fichier lorsqu'il est généré à la volée et vous ne pouvez pas déterminer qu'il s'agit d'un téléchargement de fichier de l'URL?