none
Descargar un archivo con el protocolo FTP

    Question

  • Hola:

     

    Estoy haciendo una clase que realice las funciones de un cliente ftp para que los usuarios no pierdan tiempo a la hora de actualizar las aplicaciones (es decir, un microsoft update pero en version pequeñaja).

     

    Uso las funciones de VS:

    Net.FtpWebRequest

    FtpWebResponse

     

    El servidor me da la conexion, me da el archivo solicitado, pero el problema lo tengo a la hora de almacenar el fichero.

    El servidor me da un IO.Stream. Si lo guardo como un string, al abrir el archivo, me dice que los datos son erroneos o estan dañados.

    Si lo guardo en un array de bytes no puedo ver el tamaño del IO.Stream (informandome de que no es compatible la operacion con los procesos de busqueda) cuando ejecuta la sentencia:

    Dim Lector As IO.Stream = New IO.StreamReader(response.GetResponseStream())

    Dim tamano As Long

    tamano = response.GetResponseStream().Length << Aqui es donde salta

     

    La varible lector tampoco me da su tamaño y claro el buffer ha de ser variable (por que tambien lo es el tamaño de los archivos).

    Si el tamaño del buffer lo pongo con tamaño fijo

     

    Dim escritor As IO.Stream = response.GetResponseStream()

    Dim buffer As Byte()

    ReDim Preserve buffer(10000000)

    buffer.Initialize()

    escritor.Read(buffer, 0, 10000000)

     

    Me dice que los archivos esta dañados cuando arranco el probgrama o intento abrir el archivo una vez que lo he guardado.

     

    ¿Me podeis hechar un cable?

    Es que lo unico que necesito es saber el tamaño del "io.stream" que me da el servidor. o pasar un "io.stream" a un array de bytes "bytes()" mediante una funcion cast sin que necesite el tamaño.

     

    Muchas gracias.

    Thursday, October 25, 2007 8:27 AM

Answers

  • El stream que te devuelve response.GetResponseStream(). no te permite response Length ni Seek..., debes pasarlo a otro tipo de stream como por ejemplo a un memorystream y así podras trabajar con normalidad

     

    Este problema lo tuve el otro día al obtener un fichero de una librería de documentos de SharePoint para mandarlo adjunto en un correo.

     

    Salu2

    Thursday, October 25, 2007 11:08 AM

All replies

  • El stream que te devuelve response.GetResponseStream(). no te permite response Length ni Seek..., debes pasarlo a otro tipo de stream como por ejemplo a un memorystream y así podras trabajar con normalidad

     

    Este problema lo tuve el otro día al obtener un fichero de una librería de documentos de SharePoint para mandarlo adjunto en un correo.

     

    Salu2

    Thursday, October 25, 2007 11:08 AM
  • Lo he conseguido.

    Copio la funcion entera por si alguien lo necesita para algo:

     

     

     

    Function DescargarFichero(ByVal ServidorUri As Uri, ByVal destino As String) As Boolean

    Try

    DescargarFichero = False

    Dim ftp As System.Net.FtpWebRequest = _

    CType(Net.FtpWebRequest.Create(ServidorUri), Net.FtpWebRequest)

    'Declaro que la conexion no se cierra tras terminar con la solicitud

    ftp.KeepAlive = False

    'Pido una transferencia Binaria

    ftp.UseBinary = True

    'Defino la accion de descarga

    ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile

     

    'Tomo la respuesta del Servidor Ftp

    Using Respuesta As System.Net.FtpWebResponse = CType(ftp.GetResponse, System.Net.FtpWebResponse)

    'Asocio la respuesta al stream local

    Using StreamRespuesta As IO.Stream = Respuesta.GetResponseStream

    'Bucle que lee y escribe en el fichero

    Using ptfArchivoDestino As New IO.FileStream(destino, IO.FileMode.Create)

    Dim buffer(2047) As Byte

    Dim Leido As Integer = 0

    Do

    Leido = StreamRespuesta.Read(buffer, 0, buffer.Length)

    ptfArchivoDestino.Write(buffer, 0, Leido)

    Loop Until Leido = 0 'Compruebo que noes final de transmision(1)

    'Cierro las variables

    StreamRespuesta.Close()

    ptfArchivoDestino.Flush()

    ptfArchivoDestino.Close()

    End Using

    'Cierro la variable

    StreamRespuesta.Close()

    End Using

    'Cierro la variable

    Respuesta.Close()

    End Using

    'Retorno verdadero

    DescargarFichero = True

    Catch ex As Exception

    Throw (ex)

    End Try

    End Function

     

    Thursday, October 25, 2007 2:34 PM
  • hola amigo, yo tengo uan funcion similar para descargar archivos peor no se como permitir en el destino que me descargue el archivo ya que me tira error de acceso denegado

     

    te paso la funcion:en esta linea :

    Dim fs As FileStream = New FileStream(FilePath, FileMode.Create, FileAccess.ReadWrite, FileShare.Read)

    es donde me da error de acceso denegado. seguramente tengo que validar las credenciales donde tengo que descargar el archivo porque no me deja descargarlo

    si sabes como validar en el destino te lo agradeceria

     
    es
    Code Snippet

    Public Function UploadFTP(ByVal FilePath As String, ByVal RemotePath As String, ByVal Login As String, ByVal Password As String)

    Dim fs As FileStream = New FileStream(FilePath, FileMode.Create, FileAccess.ReadWrite, FileShare.Read)

    Dim url As String = Path.Combine(RemotePath, Path.GetFileName(FilePath))

    ' Creo el objeto ftp

    Dim ftp As FtpWebRequest = FtpWebRequest.Create(url)

    ' Fijo las credenciales, usuario y contraseña

    ftp.Credentials = New NetworkCredential("huellas", "hue0524llasnet")

    ' Le digo que no mantenga la conexión activa al terminar.

    ftp.KeepAlive = False

    ' Indicamos que la operación es bajar un archivo...

    ftp.Method = WebRequestMethods.Ftp.DownloadFile

    ' … en modo binario … (podria ser como ASCII)

    ftp.UseBinary = True

    ' Indicamos la longitud total de lo que vamos a enviar.

    ftp.ContentLength = fs.Length

    ' Desactivo cualquier posible proxy http.

    ' Ojo pues de saltar este paso podría usar

    ' un proxy configurado en iexplorer

    'ftp.Proxy =

    '// Pongo el stream al inicio

    fs.Position = 0

    ' Configuro el buffer a 2 KBytes

    Dim buffLength As Int32 = 2048

    ' Dim buff() As Byte = Byte (buffLength)

    Dim buffer(2047) As Byte

    Dim contentLen As Integer

    ' obtener el stream del socket sobre el que se va a escribir.

    Dim strm As Stream = ftp.GetRequestStream()

    ' // Leer del buffer 2kb cada vez

    contentLen = fs.Read(buffer, 0, buffLength)

    ' mientras haya datos en el buffer ….

    Do While (contentLen <> 0)

    ' escribir en el stream de conexión

    'el contenido del stream del fichero

    strm.Write(buffer, 0, contentLen)

    contentLen = fs.Read(buffer, 0, buffLength)

    Loop

    End Function

     

     

    Monday, June 30, 2008 7:28 PM
  • debes darle el path completo  ej: c:\tmp\archivo.txt   Ojo debes tener acceso de escritura en la carpeta.
    • Proposed as answer by Alex Mora Thursday, January 19, 2012 2:16 PM
    Friday, May 29, 2009 5:04 PM