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");
}