webbrowser como interceptar descarga de archivos y dirigirlos donde yo quiera

Iniciado por jagrane, 22 Junio 2011, 15:34 PM

0 Miembros y 1 Visitante están viendo este tema.

jagrane

Hola
Estoy desarrollando una aplicación en Visual Basic 2005 que abre una página web concreta y segura, selecciona apuntes y hace un click por código en el botón "comprimir y descargar".

Hasta ahí, todo bien, pero al hacer click, sale la clásica ventana pidiendo qué hacer con el archivo, si abrir, guardar o cancelar, para, seguidamente, pedir el nombre y carpeta donde guardar.

La pregunta que hago es:
Cómo puedo capturar la descarga del archivo antes de que aparezcan ventanas y guardarlo donde yo quiera y con el nombre que yo quiera, sin intervención del operador?
Muchas gracias

seba123neo

Hola, te paso un ejemplo de lo que queres, haber si te sirve, lo que hace es al detectar una URL terminada en la extensión del archivo a descargar (por ejemplo .zip, .rar o .exe) lo que hace es cancelar esa ventana del internet explorer y mostrarte una ventana propia propia (crea un SaveFileDialog) donde vos le pones el nombre que quieras y lo guardas, la descarga se hace en segundo plano mediante WebClient().

Código (vbnet) [Seleccionar]
Imports System.Net

Public Class Form1

    Private Sub WebBrowser1_Navigating(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserNavigatingEventArgs) Handles WebBrowser1.Navigating
        If e.Url.Segments(e.Url.Segments.Length - 1).EndsWith(".exe") Then

            e.Cancel = True

            Dim vPath As String = ""

            Dim vFileSave As New SaveFileDialog

            vFileSave.FileName = e.Url.Segments(e.Url.Segments.Length - 1)

            If vFileSave.ShowDialog() = DialogResult.OK Then

                vPath = vFileSave.FileName

                Dim vCliente As New WebClient()

                AddHandler vCliente.DownloadProgressChanged, AddressOf ProgresoDescarga
                AddHandler vCliente.DownloadFileCompleted, AddressOf DescargaCompleta

                vCliente.DownloadFileAsync(e.Url, vPath)
            End If
        End If
    End Sub

    Private Sub DescargaCompleta(ByVal sender As Object, ByVal e As EventArgs)
        MessageBox.Show("Descarga Completa")
    End Sub

    Private Sub ProgresoDescarga(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)

        Dim bytesIn As Double = Double.Parse(e.BytesReceived.ToString())
        Dim totalBytes As Double = Double.Parse(e.TotalBytesToReceive.ToString())
        Dim percentage As Double = bytesIn / totalBytes * 100

        Me.Text = "Progreso Completado: " & Integer.Parse(Math.Truncate(percentage).ToString()) & " %"
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        WebBrowser1.Navigate("http://releases.mozilla.org/pub/mozilla.org/firefox/releases/5.0/win32/es-AR/Firefox%20Setup%205.0.exe")
    End Sub
End Class


este ejemplo descarga del FTP de mozilla firefox, el .exe de la version 5.0

tiene 2 manejadores de eventos, uno para la descarga completada y el otro para el progreso (que te lo muestra en la barra de titulo).

hasta si queres podes sacarle que no cree la ventana, y que lo ponga en el path que vos le digas, ahi si no tendria que apretar nada el usuario.

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

jagrane

Gracias seba123neo
He probado tu rutina, pero no me funciona, porque debe trabajara de otra manera:
Al hacer click, solamente envía la url de la página, y entiendo que las identificaciones de los registros a comprimir irán por post. Acto seguido aparece la pantalla de petición.

He puesto un punto de control en el primer if y consultado la url, y en ningún caso pasa el zip por ahí, por lo que no me funciona en este caso.

¿Sabes si hay alguna forma de saber las variables que se envían por post?
¿O cómo cambiar la url para que la envíe a otro sitio?  Tengo instalado u servidor apache y podría dirigirlo a localhost/quevariables.php y hacer un volcado del post.

Y en este caso:
¿Cómo incluir las variables post al enviar la url con webclient?

O inyectar rutinas en java y que se puedan ejecutar.

Te incluyo un ejemplo muy reducido del código de la página:
<TABLE id=row>
  <THEAD>
  <TR>
    <TH></TH>
    <TH>Estado</TH>
    <TH>Remitente</TH>
    <TH>Destinatario</TH>
    <TH>Asunto</TH>
    <TH>Nº Ord</TH>
    <TH>Fecha envío</TH>
  </TR>
  </THEAD>
  <TBODY>
  <TR>
    <TD><INPUT id=idMensajeSeleccionado1 title="Seleccionar mensaje"
      onkeypress=actualizarSeleccionados(this);
      onclick=actualizarSeleccionados(this);
      value="000001"
      type=checkbox name=idMensajeSeleccionado><INPUT value=on type=hidden
      name=_idMensajeSeleccionado> </TD>
    <TD><IMG alt="Mensaje no leído" src="ico_noleido.gif"></TD>
    <TD>JUAN MARTINEZ PEREZ</TD>
    <TD>PEDRO SANCHEZ ETCETERA</TD>
    <TD>Orden de pedido</TD>
    <TD>20100000853</TD>
    <TD>02/06/2011 17:48:29</TD>
  </TR>
  <TR>
    <TD><INPUT id=idMensajeSeleccionado1 title="Seleccionar mensaje"
      onkeypress=actualizarSeleccionados(this);
      onclick=actualizarSeleccionados(this);
      value="000001"
      type=checkbox name=idMensajeSeleccionado><INPUT value=on type=hidden
      name=_idMensajeSeleccionado> </TD>
    <TD><IMG alt="Mensaje no leído" src="ico_noleido.gif"></TD>
    <TD>JUAN MARTINEZ PEREZ</TD>
    <TD>PEDRO SANCHEZ ETCETERA</TD>
    <TD>Orden de pedido</TD>
    <TD>20100000853</TD>
    <TD>02/06/2011 17:48:29</TD>
  </TR>
  <TR>
    <TD><INPUT id=idMensajeSeleccionado1 title="Seleccionar mensaje"
      onkeypress=actualizarSeleccionados(this);
      onclick=actualizarSeleccionados(this);
      value="000002"
      type=checkbox name=idMensajeSeleccionado><INPUT value=on type=hidden
      name=_idMensajeSeleccionado> </TD>
    <TD><IMG alt="Mensaje no leído" src="ico_noleido.gif"></TD>
    <TD>JUAN MARTINEZ PEREZ</TD>
    <TD>PEDRO SANCHEZ ETCETERA</TD>
    <TD>Orden de pedido</TD>
    <TD>20100000853</TD>
    <TD>02/06/2011 17:48:29</TD>
  </TR>
  <TR>
    <TD><INPUT id=idMensajeSeleccionado1 title="Seleccionar mensaje"
      onkeypress=actualizarSeleccionados(this);
      onclick=actualizarSeleccionados(this);
      value="000003"
      type=checkbox name=idMensajeSeleccionado><INPUT value=on type=hidden
      name=_idMensajeSeleccionado> </TD>
    <TD><IMG alt="Mensaje no leído" src="ico_noleido.gif"></TD>
    <TD>JUAN MARTINEZ PEREZ</TD>
    <TD>PEDRO SANCHEZ ETCETERA</TD>
    <TD>Orden de pedido</TD>
    <TD>20100000853</TD>
    <TD>02/06/2011 17:48:29</TD>
  </TR>
  </TBODY>
</TABLE>
<P>Mensajes seleccionados :<SPAN id=seleccionados>
<SCRIPT>imprimeValor(selec);</SCRIPT>
</SPAN></P>
<INPUT class=botones title="Comprimir y descargar los mensajes seleccionados" value=Descargar type=submit name=descargar>


Este ultimo boton es el que yo estoy intentando gestionar.

No obstante, en mis búsquedas por la red, creo que hay más gente que busca una subrutina como la tuya.
Un saludo
Jagrane