[ASP.NET] Subiendo un archivo a un servidor FTP con un FileUpload

Hace poco me preguntaban en el blog sobre como era posible subir un archivo a un servidor FTP utilizando el FileUpload de ASP.NET, esto se dio ya que tenia un post en el cual mostraba como poder usar ese control (mira el post acá), así que en esta entrada deseo responder a esa pregunta.

Lo primero a tener en cuenta es que el control fileupload no funciona nativamente con el protocolo FTP, sino con el HTTP, así que debemos realiza algunos pequeños cambios y usar alguna clase de .net que nos permita trabajar con FTP; así que manos a la obra, lo primero es diseñar una interfaz para la selección del archivo, y tres campos de texto para el ingreso de:

  • Servidor FTP
  • Usuario
  • Clave

Entonces el HTML de nuestra página sería:

   1:  <h1>Subir archivo a un servidor FTP</h1>
   2:  <hr />
   3:  <fieldset>
   4:      <legend>Configuración FTP</legend>
   5:      <table>
   6:          <tr>
   7:              <td><b>Servidor:</b></td>
   8:              <td><asp:TextBox ID="txtServidor" runat="server" Width="300px"></asp:TextBox></td>
   9:          </tr>
  10:          <tr>
  11:              <td><b>Usuario:</b></td>
  12:              <td><asp:TextBox ID="txtUsuario" runat="server" Width="300px"></asp:TextBox></td>
  13:          </tr>
  14:          <tr>
  15:              <td><b>Clave:</b></td>
  16:              <td><asp:TextBox ID="txtClave" runat="server" Width="300px"></asp:TextBox></td>
  17:          </tr>
  18:          <tr>
  19:              <td><b>Archivo:</b></td>
  20:              <td><asp:FileUpload ID="fileUpload1" runat="server" /></td>
  21:          </tr>
  22:          <tr>
  23:              <td colspan="2">
  24:                  <asp:Button Text="Subir Archivo FTP" runat="server" ID="btnSubirArchivo" onclick="btnSubirArchivo_Click" />
  25:              </td>
  26:          </tr>
  27:      </table>
  28:  </fieldset>

Y ahora el código del evento clic del botón:

   1:  if (fileUpload1.HasFile)
   2:  {
   3:      var server = String.Format("{0}files/{1}", txtServidor.Text, fileUpload1.FileName);
   4:      var user = txtUsuario.Text;
   5:      var pass = txtClave.Text;
   6:   
   7:      var request = WebRequest.Create(server);
   8:      request.Method = WebRequestMethods.Ftp.UploadFile;
   9:      request.Credentials = new NetworkCredential(user, pass);
  10:   
  11:      var sourceStream = new StreamReader(fileUpload1.FileContent);
  12:      var fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
  13:      sourceStream.Close();
  14:      request.ContentLength = fileContents.Length;
  15:   
  16:      var requestStream = request.GetRequestStream();
  17:      requestStream.Write(fileContents, 0, fileContents.Length);
  18:      requestStream.Close();
  19:   
  20:      var response = (FtpWebResponse)request.GetResponse();
  21:      lblEstado.Text = response.StatusDescription;
  22:      response.Close();
  23:  }

Y listo, estamos tomando el archivo del fileupload, pero en este caso utilizamos fileupload1.FileContent.

Espero les sea de utilidad, como siempre les dejo el código del ejemplo, saludos!

Descarga el ejemplo!

4 comments

Leave a Reply

Your email address will not be published. Required fields are marked *