none
Por qué no funciona mi código RRS feed

  • Pregunta

  • Estoy intentando recuperar una lista de imágenes que tengo en un servidor FTP, para ello busco el nombre de todas hago un Random y muestro la imagen creando la ruta completa.

    Dim FTPaddress As String = "ftp://ftp.misitio.com" Dim Username As String = "usuario" Dim Password As String = "contraseña" Dim Request As FtpWebRequest = DirectCast(FtpWebRequest.Create(FTPaddress), FtpWebRequest) request.Method = WebRequestMethods.Ftp.ListDirectory request.Credentials = New NetworkCredential(Username, Password) request.UsePassive = True request.UseBinary = True request.KeepAlive = False 'Obtengo el nombre de los elementos. Using response = DirectCast(Request.GetResponse(), FtpWebResponse) Using stream = response.GetResponseStream() Using reader = New StreamReader(stream, True) While Not reader.EndOfStream List.Items.Add(reader.ReadLine()) End While End Using End Using End Using

    'hasta aquí funciona perfectamente. Dim Fil As String = FTPaddress & "/" & SeaFile() oImgAd.ImageUrl = Fil End Sub Private Function SeaFile() As String Dim res As String = "" parte2: ' Initialize the random-number generator. Randomize() ' Generate random value between 1 and 6. Dim numeroAleatorio As New Random() Dim i As Integer = numeroAleatorio.Next(0, List.Items.Count - 1) 'Busco ese número en la lista. Dim str As String = List.Items.Item(i).Value.ToString If str.StartsWith(".") = True Then 'Aparecen elementos que no están en el servidor. GoTo parte2 End If res = str Return res End Function



    Si la contestación te ha servido de ayuda márcala como respuesta. Si lo que publico no funciona, no tengo la culpa, SOY HUMANO, no una máquina. M-Registry Cleaner, el programa que he creado con ayuda del foro, ya se puede descargar desde mi página o sino realizar alguna que otra donación en mcaresoft.wordpress.com sería de agradecer.


    • Editado LTNs lunes, 13 de julio de 2015 9:02
    lunes, 13 de julio de 2015 9:02

Respuestas

  • Tendrías que seguir la idea que te comenta Sergio salvo que al tratarse de un control de WebForms (corrígeme si me equivoco) no vas a poder asignarle el stream directamente. Tendrías dos opciones:

    - Guardar la imagen descargada en disco y que la url accediera a ese nuevo archivo

    - Crear una página aspx que se encargue de descargar la imagen y devolverla al navegador y que la url de la imagen apunte a esa nueva página.

    Aunque pueda parecer más compleja te aconsejaría utilizar la segunda opción, seguro que te quitas un montón de quebraderos de cabeza en el futuro (gestión de permisos, eliminación de ficheros antiguos, etc.)


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta LTNs lunes, 13 de julio de 2015 14:17
    lunes, 13 de julio de 2015 11:26
  • No te funciona porque necesitas validarte para descargar la imagen, no te basta con poner la url en la propiedad ImageUrl.

    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta LTNs lunes, 13 de julio de 2015 14:17
    lunes, 13 de julio de 2015 9:11
  • Qué es lo que no te funciona? 

    También decirte que el empleo de GoTo pueden dificultar la lectura y el mantenimiento del código. Yo reharía tu método de la siguiente manera

     Private Function SeaFile() As String
    	Dim res As String = String.Empty
    	Dim str As String = String.Empty
    
    	Do
    		' Initialize the random-number generator.
    		Randomize()
    		' Generate random value between 1 and 6.
    		Dim numeroAleatorio As New Random()
    		Dim i As Integer = numeroAleatorio.Next(0, List.Items.Count - 1)
    
    		'Busco ese número en la lista.
    		str = List.Items.Item(i).Value.ToString
     
    	Loop Until Not str.StartsWith(".") 
    	
    	res = str
    	Return res
    End Function


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta LTNs lunes, 13 de julio de 2015 14:17
    lunes, 13 de julio de 2015 9:17
  • Private Function SeaFile() As String
    	Dim res As String = String.Empty
    	Dim str As String = String.Empty
    	' Initialize the random-number generator.
    	Randomize()
    	' Generate random value between 1 and 6.
    	Dim numeroAleatorio As New Random()
    
    	Do
    		Dim i As Integer = numeroAleatorio.Next(0, List.Items.Count - 1)
    
    		'Busco ese número en la lista.
    		str = List.Items.Item(i).Value.ToString
     
    	Loop Until Not str.StartsWith(".") 
    	
    	res = str
    	Return res
    End Function

    Las funciones de inicialización del Random deben ir fuera del bucle.

    Para mostrar la imagen deberás descargarla del FTP y después mostrarla, usa un WebClient o algo similar para descargarla.


    • Editado David Porqueras lunes, 13 de julio de 2015 9:34
    • Marcado como respuesta LTNs lunes, 13 de julio de 2015 14:17
    lunes, 13 de julio de 2015 9:32
  • Puedes hacer el siguiente método para crear un stream de la imagen descargada desde tu ftp y luego establecerla a tu control imagen.

    Public Function GetImageFromFTP(ByVal ftpImageAddress As String, ByVal userName As String, ByVal password As String) As MemoryStream
     
     
        Dim ftpRequest As FtpWebRequest = DirectCast(WebRequest.Create(ftpImageAddress), FtpWebRequest)
        ftpRequest.Credentials = New NetworkCredential(userName, password)
        ftpRequest.UseBinary = True 
        ftpRequest.KeepAlive = False 'No Zombies
    
     
        ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile
     
        Dim memStream As New MemoryStream
        Dim ftpResponse As FtpWebResponse = DirectCast(ftpRequest.GetResponse, FtpWebResponse)
    
    	Using response As Stream = ftpResponse.GetResponseStream()
    		memStream = New MemoryStream()
    
    		Dim buffer As Byte() = New Byte(1023) {}
    		Dim byteCount As Integer
    		Do
    			byteCount = response.Read(buffer, 0, buffer.Length)
    			memStream.Write(buffer, 0, byteCount)
    		Loop While byteCount > 0
    	End Using
    
    	Return memStream
    End Function
    
     

    Luego en tu código lo llamas así  las lineas

    Dim Fil As String = FTPaddress & "/" & SeaFile()
    
    oImgAd.Image  = Image.FromStream(GetImageFromFTP(Fil, Username, Password))

     

    Es un ejemplo que no he probado por lo que quizá necesite algunos ajustes pero la idea espero esté clara



    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    • Editado Sergio Parra lunes, 13 de julio de 2015 10:35
    • Marcado como respuesta LTNs lunes, 13 de julio de 2015 14:17
    lunes, 13 de julio de 2015 10:35
  • Ahora que lo comentas...

    lo del web form

    "No me funciona y además es muy lento, podría hacer lo mismo pero incluyendo todas las imagenes en una carpeta que creo junto al .aspx"

    Sorry! No me había percatado de ello hasta ahora. Buenas ideas las de Asier.


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta LTNs lunes, 13 de julio de 2015 14:17
    lunes, 13 de julio de 2015 11:55
  • Puedes hacer lo siguiente...

    Recuperar el memorystream de mi codigo y establecer una url codificada a base64

    Sería así

    Dim ms As MemoryStream = GetImageFromFTP(Fil, Username, Password)
    oImgAd.ImageUrl = "data:image/png;base64," + Convert.ToBase64String(ms.ToArray(), 0, ms.ToArray().Length)


    Suponiendo que las imagenes estén en formato png. Si son gif cambias a 

    image/gif o image/jpg .....

    etc


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos



    • Editado Sergio Parra lunes, 13 de julio de 2015 12:01
    • Marcado como respuesta LTNs lunes, 13 de julio de 2015 14:17
    lunes, 13 de julio de 2015 12:00

Todas las respuestas

  • No te funciona porque necesitas validarte para descargar la imagen, no te basta con poner la url en la propiedad ImageUrl.

    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta LTNs lunes, 13 de julio de 2015 14:17
    lunes, 13 de julio de 2015 9:11
  • Me puedes poner la linea que me falta.

    Si la contestación te ha servido de ayuda márcala como respuesta. Si lo que publico no funciona, no tengo la culpa, SOY HUMANO, no una máquina. M-Registry Cleaner, el programa que he creado con ayuda del foro, ya se puede descargar desde mi página o sino realizar alguna que otra donación en mcaresoft.wordpress.com sería de agradecer.

    lunes, 13 de julio de 2015 9:13
  • Qué es lo que no te funciona? 

    También decirte que el empleo de GoTo pueden dificultar la lectura y el mantenimiento del código. Yo reharía tu método de la siguiente manera

     Private Function SeaFile() As String
    	Dim res As String = String.Empty
    	Dim str As String = String.Empty
    
    	Do
    		' Initialize the random-number generator.
    		Randomize()
    		' Generate random value between 1 and 6.
    		Dim numeroAleatorio As New Random()
    		Dim i As Integer = numeroAleatorio.Next(0, List.Items.Count - 1)
    
    		'Busco ese número en la lista.
    		str = List.Items.Item(i).Value.ToString
     
    	Loop Until Not str.StartsWith(".") 
    	
    	res = str
    	Return res
    End Function


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta LTNs lunes, 13 de julio de 2015 14:17
    lunes, 13 de julio de 2015 9:17
  • No me funciona y además es muy lento, podría hacer lo mismo pero incluyendo todas las imagenes en una carpeta que creo junto al .aspx

    Si la contestación te ha servido de ayuda márcala como respuesta. Si lo que publico no funciona, no tengo la culpa, SOY HUMANO, no una máquina. M-Registry Cleaner, el programa que he creado con ayuda del foro, ya se puede descargar desde mi página o sino realizar alguna que otra donación en mcaresoft.wordpress.com sería de agradecer.

    lunes, 13 de julio de 2015 9:30
  • Private Function SeaFile() As String
    	Dim res As String = String.Empty
    	Dim str As String = String.Empty
    	' Initialize the random-number generator.
    	Randomize()
    	' Generate random value between 1 and 6.
    	Dim numeroAleatorio As New Random()
    
    	Do
    		Dim i As Integer = numeroAleatorio.Next(0, List.Items.Count - 1)
    
    		'Busco ese número en la lista.
    		str = List.Items.Item(i).Value.ToString
     
    	Loop Until Not str.StartsWith(".") 
    	
    	res = str
    	Return res
    End Function

    Las funciones de inicialización del Random deben ir fuera del bucle.

    Para mostrar la imagen deberás descargarla del FTP y después mostrarla, usa un WebClient o algo similar para descargarla.


    • Editado David Porqueras lunes, 13 de julio de 2015 9:34
    • Marcado como respuesta LTNs lunes, 13 de julio de 2015 14:17
    lunes, 13 de julio de 2015 9:32
  • Puedes hacer el siguiente método para crear un stream de la imagen descargada desde tu ftp y luego establecerla a tu control imagen.

    Public Function GetImageFromFTP(ByVal ftpImageAddress As String, ByVal userName As String, ByVal password As String) As MemoryStream
     
     
        Dim ftpRequest As FtpWebRequest = DirectCast(WebRequest.Create(ftpImageAddress), FtpWebRequest)
        ftpRequest.Credentials = New NetworkCredential(userName, password)
        ftpRequest.UseBinary = True 
        ftpRequest.KeepAlive = False 'No Zombies
    
     
        ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile
     
        Dim memStream As New MemoryStream
        Dim ftpResponse As FtpWebResponse = DirectCast(ftpRequest.GetResponse, FtpWebResponse)
    
    	Using response As Stream = ftpResponse.GetResponseStream()
    		memStream = New MemoryStream()
    
    		Dim buffer As Byte() = New Byte(1023) {}
    		Dim byteCount As Integer
    		Do
    			byteCount = response.Read(buffer, 0, buffer.Length)
    			memStream.Write(buffer, 0, byteCount)
    		Loop While byteCount > 0
    	End Using
    
    	Return memStream
    End Function
    
     

    Luego en tu código lo llamas así  las lineas

    Dim Fil As String = FTPaddress & "/" & SeaFile()
    
    oImgAd.Image  = Image.FromStream(GetImageFromFTP(Fil, Username, Password))

     

    Es un ejemplo que no he probado por lo que quizá necesite algunos ajustes pero la idea espero esté clara



    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    • Editado Sergio Parra lunes, 13 de julio de 2015 10:35
    • Marcado como respuesta LTNs lunes, 13 de julio de 2015 14:17
    lunes, 13 de julio de 2015 10:35
  • Tendrías que seguir la idea que te comenta Sergio salvo que al tratarse de un control de WebForms (corrígeme si me equivoco) no vas a poder asignarle el stream directamente. Tendrías dos opciones:

    - Guardar la imagen descargada en disco y que la url accediera a ese nuevo archivo

    - Crear una página aspx que se encargue de descargar la imagen y devolverla al navegador y que la url de la imagen apunte a esa nueva página.

    Aunque pueda parecer más compleja te aconsejaría utilizar la segunda opción, seguro que te quitas un montón de quebraderos de cabeza en el futuro (gestión de permisos, eliminación de ficheros antiguos, etc.)


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta LTNs lunes, 13 de julio de 2015 14:17
    lunes, 13 de julio de 2015 11:26
  • Ahora que lo comentas...

    lo del web form

    "No me funciona y además es muy lento, podría hacer lo mismo pero incluyendo todas las imagenes en una carpeta que creo junto al .aspx"

    Sorry! No me había percatado de ello hasta ahora. Buenas ideas las de Asier.


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta LTNs lunes, 13 de julio de 2015 14:17
    lunes, 13 de julio de 2015 11:55
  • Puedes hacer lo siguiente...

    Recuperar el memorystream de mi codigo y establecer una url codificada a base64

    Sería así

    Dim ms As MemoryStream = GetImageFromFTP(Fil, Username, Password)
    oImgAd.ImageUrl = "data:image/png;base64," + Convert.ToBase64String(ms.ToArray(), 0, ms.ToArray().Length)


    Suponiendo que las imagenes estén en formato png. Si son gif cambias a 

    image/gif o image/jpg .....

    etc


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos



    • Editado Sergio Parra lunes, 13 de julio de 2015 12:01
    • Marcado como respuesta LTNs lunes, 13 de julio de 2015 14:17
    lunes, 13 de julio de 2015 12:00
  • Muchas gracias a todos.

    Si la contestación te ha servido de ayuda márcala como respuesta. Si lo que publico no funciona, no tengo la culpa, SOY HUMANO, no una máquina. M-Registry Cleaner, el programa que he creado con ayuda del foro, ya se puede descargar desde mi página o sino realizar alguna que otra donación en mcaresoft.wordpress.com sería de agradecer.

    lunes, 13 de julio de 2015 14:17