Cómo cargar y descargar archivos desde un servidor remoto en ASP.NET

Se aplica a: Microsoft ASP.NET 3.5


Haga clic aquí para ver el artículo original (en inglés): 2512241

INTRODUCCIÓN


Este artículo describe un ejemplo de marco de todo en uno que está disponible para su descarga. Este ejemplo de código muestra cómo cargar y descargar archivos desde un servidor local o remoto en ASP.NET. Puede descargar los paquetes de muestra de los siguientes iconos de descarga. C# y Visual Basic .NET versiones de idioma del paquete de ejemplo están disponibles.

Este ejemplo de código muestra cómo cargar y descargar archivos desde un servidor que no está en el ámbito de dominio de solicitud del usuario. La funcionalidad se proporciona para transferir archivos con protocolos el HTTP y FTP. Además, en este ejemplo de código se utiliza identificadores uniformes de recursos (URI) para identificar las ubicaciones de archivos en un servidor. Las clases clave utilizadas en este ejemplo de código son la clase y la clase WebRequest .

Nivel de dificultad

Información de descarga

Para descargar este ejemplo de código, haga clic en uno de los siguientes vínculos:

Introducción técnica

Es bastante fácil cargar y descargar archivos desde un servidor remoto en ASP.NET. La biblioteca de clases de.NET Framework proporciona algunos objetos ligeros de solicitud. La clase es una clase de alto nivel que facilita la interacción entre servidores. Objetos WebRequest se utilizan la clase WebClient para realizar solicitudes. Las clases HttpWebRequest y FtpWebRequest son implementaciones específicas de protocolo de la clase WebRequest abstracta. HttpWebRequest implementa los métodos GET y POST del protocolo HTTP para cargar y descargar archivos. FtpWebRequest implementa los métodos de almacenamiento y RETR del protocolo FTP para cargar y descargar archivos.

Este código de ejemplo utiliza los métodos de la clase WebClientUploadData y DownloadData para transferir datos hacia y desde el URI del servidor remoto. El métodoUploadDatase utiliza con el método PUT del protocolo HTTP y escriba el medio de Internet "application/x--www-form-urlencoded". El métodoDownloadData se utiliza con un objeto FileStream para almacenar la secuencia de datos entrantes y escribir la matriz de bytes en un archivo local.

Resumen de ejemplo

En este ejemplo de código, encontrará el archivo RemoteFileForm.aspx que se explica cómo usar dos nuevas clases:
  • RemoteUpload
  • RemoteDownload

La clase RemoteUpload

La clase RemoteUpload tiene dos clases secundarias. Estas clases son HttpRemoteUpload y FtpRemoteUpload. Ambas clases utilizan el constructor RemoteUpload . La clase RemoteUpload requiere una matriz de bytes de los datos del archivo y el URI del servidor. También puede especificar el nombre que se va a utilizar para el archivo cargado. La clase FtpRemoteUpload utiliza FtpWebRequest directamente (en lugar de utilizar la clase WebClient nivel superior) para manejar los requerimientos específicos del protocolo FTP.

Consulte las siguientes definiciones de clase para obtener más información acerca de la clase RemoteUpload :
public class HttpRemoteUpload : RemoteUpload
{
public HttpRemoteUpload(byte[] fileData, string fileNamePath, string urlString)
: base(fileData, fileNamePath, urlString)
{

}

public override bool UploadFile()
{
byte[] postData;
try
{
postData = this.FileData;
using (WebClient client = new WebClient())
{
client.Credentials = CredentialCache.DefaultCredentials;
client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
client.UploadData(this.UrlString, "PUT", postData);
}

return true;
}
catch (Exception ex)
{
throw new Exception("Failed to upload", ex.InnerException);
}

}
}

public class FtpRemoteUpload : RemoteUpload
{
public FtpRemoteUpload(byte[] fileData, string fileNamePath, string urlString)
: base(fileData, fileNamePath, urlString)
{

}

public override bool UploadFile()
{
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(this.UrlString);
reqFTP.KeepAlive = true;
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.UseBinary = true;
reqFTP.ContentLength = this.FileData.Length;

int buffLength = 2048;
byte[] buff = new byte[buffLength];
MemoryStream ms = new MemoryStream(this.FileData);

try
{
int contenctLength;
using (Stream strm = reqFTP.GetRequestStream())
{
contenctLength = ms.Read(buff, 0, buffLength);
while (contenctLength > 0)
{
strm.Write(buff, 0, contenctLength);
contenctLength = ms.Read(buff, 0, buffLength);
}
}

return true;
}
catch (Exception ex)
{
throw new Exception("Failed to upload", ex.InnerException);
}
}

}
En el archivo RemoteFileForm.cs, al hacer clic en el botón cargar , se crea una instancia del objeto RemoteUpload . Pasar el URI del servidor y una ruta de archivo físico local como parámetros para crear el objeto.

Nota: Si no especifica un nombre de archivo se utiliza para almacenar el archivo en el servidor, el sistema generará automáticamente un nombre de archivo según la fecha y hora actuales en el servidor. La fecha y hora es precisa hasta el milisegundo. Después de que finalice el método UploadData , el resultado se muestra en la página actual.

La clase RemoteDownload

La clase RemoteDownload también tiene dos clases secundarias. Estas clases son HttpRemoteDownload y FtpRemoteDownload. La clase RemoteDownload requiere un recurso URI y un directorio físico local. La clase RemoteDownload se comprueba para asegurarse de que existe el recurso URI antes de la descarga se ha iniciado. La clase recupera la secuencia que contiene los datos de respuesta del servidor y, a continuación, escribe esta matriz de bytes en un FileStream. La clase FtpRemoteDownload utiliza FtpWebRequest directamente (en lugar de utilizar la clase WebClient nivel superior) para manejar los requerimientos específicos del protocolo FTP.

Consulte las siguientes definiciones de clase para obtener más información acerca de la clase RemoteDownload :
 public class HttpRemoteDownload : RemoteDownload
{
public HttpRemoteDownload(string urlString, string descFilePath)
: base(urlString, descFilePath)
{

}

public override bool DownloadFile()
{
string fileName = System.IO.Path.GetFileName(this.UrlString);
string descFilePathAndName =
System.IO.Path.Combine(this.DescFilePath, fileName);
try
{
WebRequest myre = WebRequest.Create(this.UrlString);
}
catch
{
return false;
}
try
{
byte[] fileData;
using (WebClient client = new WebClient())
{
fileData = client.DownloadData(this.UrlString);
}
using (FileStream fs =
new FileStream(descFilePathAndName, FileMode.OpenOrCreate))
{
fs.Write(fileData, 0, fileData.Length);
}
return true;
}
catch (Exception ex)
{
throw new Exception("download field", ex.InnerException);
}
}
}

public class FtpRemoteDownload : RemoteDownload
{
public FtpRemoteDownload(string urlString, string descFilePath)
: base(urlString, descFilePath)
{

}

public override bool DownloadFile()
{
FtpWebRequest reqFTP;

string fileName = System.IO.Path.GetFileName(this.UrlString);
string descFilePathAndName =
System.IO.Path.Combine(this.DescFilePath, fileName);

try
{

reqFTP = (FtpWebRequest)FtpWebRequest.Create(this.UrlString);
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;


using (FileStream outputStream = new FileStream(descFilePathAndName, FileMode.OpenOrCreate))
using (FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse())
using (Stream ftpStream = response.GetResponseStream())
{
int bufferSize = 2048;
int readCount;
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
outputStream.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
}
}
return true;
}

catch (Exception ex)
{
throw new Exception("upload failed", ex.InnerException);
}
}
}

Nota: Para obtener más información acerca de cómo crear e implementar la aplicación de ejemplo, consulte el archivo Readme.txt que se incluye en el paquete de descarga.

Idiomas

Este ejemplo de código está disponible en los siguientes lenguajes de programación:
IdiomaNombre del proyecto
Visual C#CSRemoteUploadAndDownload
Visual Basic.NETVRemoteUploadAndDownload

Categoría tecnología

  • ASP.NET 2.0
  • ASP.NET 3.5
  • ASP.NET 4.0

Referencias

Para obtener más información acerca de la clase WebClient , visite el siguiente sitio Web de Microsoft Developer (MSDN):Para obtener más información acerca del método UploadData , visite el siguiente sitio Web MSDN:Para obtener más información acerca del método DonwloadData , visite el siguiente sitio Web MSDN:Para obtener más información acerca del método FtpWebRequest , visite el siguiente sitio Web MSDN:Para obtener más información acerca de cómo cargar archivos con FTP, visite el siguiente sitio Web MSDN:

Más información


¿Qué es-One Code Framework?

-One code Framework muestra la mayoría de las técnicas de desarrollo de Microsoft mediante el uso de ejemplos de código en diferentes lenguajes de programación. Cada ejemplo está cuidadosamente seleccionado, compuesto y documentado para mostrar un escenario común de código. Para obtener más información acerca de-One Code Framework, visite el siguiente sitio Web de Microsoft:

Cómo encontrar más ejemplos de código Framework todo en uno

Para encontrar más ejemplos de código Framework todo en uno, busque "kbcodefx", junto con palabras clave relacionadas en Microsoft sitio Web de soporte. O bien, visite el siguiente sitio Web de Microsoft:
Renuncia de publicación rápida
Microsoft corporation y/o sus respectivos proveedores no se responsabilizan de la idoneidad, fiabilidad o exactitud de la información y los gráficos relacionados contenidos en este documento. Dicha información y los gráficos relacionados se proporcionan "tal cual" sin garantía de ningún tipo. Microsoft y/o sus respectivos proveedores excluyen en este acto toda garantía y condición respecto a esta información y gráficos relacionados, incluida toda garantía implícita y condiciones de comerciabilidad, idoneidad para un fin determinado, esfuerzo razonable, título y ausencia de infracción. Usted acepta específicamente que en ningún caso Microsoft o sus proveedores serán responsables de daños directos, indirectos, PUNITIVOS, INCIDENTALES, CONSECUENCIALES, especiales ni de daños, incluidos, sin limitación, daños por pérdida de uso, datos o beneficios, que surja de o en cualquier modo conectados con el uso o la incapacidad para utilizar la información y los gráficos relacionados contenidos en este documento , basado en contrato, AGRAVIO, negligencia, responsabilidad estricta o de otro tipo, incluso si Microsoft o cualquiera de sus proveedores hubiera sido advertida de la posibilidad de daños.