Enviar un Stream por FTP

by Valeriano Tortola 2. septiembre 2007 18:50

Siguiendo con el artículo sobre como enviar un archivo por FTP, no siempre lo que queremos enviar esta ya materializado en el sistema de archivos, puede ser también un archivo que estemos generando en memoria, como un reporte, un archivo .pdf, .xml .. etc.. etc.. y tener que guardarlo en disco para luego poderlo enviar por FTP es molesto, asi que aquí va un ejemplo de como enviar el contenido de un Stream (ó derivado) a un FTP:

 

public static void UploadStreamFTP(
    Stream stream, // Stream que contiene los datos
    string RemotePath, // Servidor ftp + ruta + nombre del archivo de destino
    string Login, string Password)
{
    // Creo el objeto ftp
    FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(RemotePath);
 
    // Fijo las credenciales, usuario y contraseña
    ftp.Credentials = new NetworkCredential(Login, Password);
 
    // Le digo que no mantenga la conexión activa al terminar.
    ftp.KeepAlive = false;
 
    // Indicamos que la operación es subir un archivo...
    ftp.Method = WebRequestMethods.Ftp.UploadFile;
 
    // … en modo binario … (podria ser como ASCII)
    ftp.UseBinary = true;
 
    // Indicamos la longitud total de lo que vamos a enviar.
    ftp.ContentLength = stream.Length;
 
    // Desactivo cualquier posible proxy http.
    // Ojo pues de saltar este paso podría usar 
    // un proxy configurado en iexplorer
    ftp.Proxy = null;
 
    // Si esta soportado... conexión segura
    ftp.EnableSsl = false;
 
    // Pongo el stream al inicio
    stream.Position = 0;
 
    // Configuro el buffer a 2 KBytes
    int buffLength = 2048;
    byte[] buff = new byte[buffLength];
 
    int contentLen;
 
    // obtener el stream del socket sobre el que se va a escribir.
    using (Stream strm = ftp.GetRequestStream())
    {
        // Leer del buffer 2kb cada vez
        contentLen = stream.Read(buff, 0, buffLength);
 
        // mientras haya datos en el buffer ….
        while (contentLen != 0)
        {
            // escribir en el stream de conexión
            //el contenido del stream del fichero
            strm.Write(buff, 0, contentLen);
            contentLen = stream.Read(buff, 0, buffLength);
        }
    }
}

Para usarlo, simplemente pasar los parámetros correctos a la función, aquí va un sencillo ejemplo:

using (MemoryStream memorystrm = new MemoryStream())
using (StreamWriter sw = new StreamWriter(memorystrm, Encoding.ASCII))
{
    // Escribo 100 líneas para rellenar el fichero de prueba
    for(int i=0;i<100;i++)
    {
        sw.WriteLine("Línea prueba: {0}",i); 
    }
    sw.Flush();
    UploadStreamFTP(memorystrm,
        "ftp://ftp.miftp.net/Public/ArchivoPrueba.txt", 
        "miuser", "mipass");
}

Tags: , , ,

.NET 2.0 | C# 2.0

Comentarios

02/09/2007 19:52:46 #

trackback

Trackback from vtortola

Enviar un Stream por FTP

vtortola |

05/10/2007 13:46:53 #

trackback

Trackback from vtortola

Descargando un fichero por FTP

vtortola |

Comentarios no permitidos