none
Subir archivos grandes a un FTP RRS feed

  • Pregunta

  • Hola a todos

    Tengo el siguiente problema, navegando por internet encontré este código que sirve para subir archivos a un FTP.

    FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("address del ftp");
                            request.Method = WebRequestMethods.Ftp.UploadFile;
                            request.Credentials = new NetworkCredential("nombre de usuario", "contraseña");
                            request.UsePassive = true;
                            request.UseBinary = true;
                            request.KeepAlive = true;                        
                            using (FileStream stream = File.OpenRead("ruta del archivo a subir"))
                            {
                                byte[] buffer = new byte[stream.Length];
                                stream.Read(buffer, 0, buffer.Length);
                                stream.Close();
                                Stream reqStream = request.GetRequestStream();
                               
                                reqStream.Write(buffer, 0, buffer.Length);
                                reqStream.Flush();
                                reqStream.Close();
                            }

    Toda funciona muy bien con archivos pequeños, pero cuando se trata de archivos grandes, como por ejemplo que pesen más de 100 MB la subida se corta y el archivo queda incompleto. Me manda la siguiente excepción  "Se ha terminado la conexión: Error inesperado de recepción"

    Alguien que ya le haya pasado que me pueda ayudar. U otra forma para subirlos.

    Gracias a todos

    domingo, 25 de marzo de 2018 19:29

Respuestas

  • Ah ok.  Parece que cometí el error de confundir parámetros.  Soy de la vieja escuela y escribí el código sin verificar.

    Primero esta línea:

    bytesRead = stream.Read(buffer, 0, buffer.Length);

    Luego esta línea:

    reqStream.Write(buffer, 0, bytesRead);


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Carlos78f martes, 27 de marzo de 2018 2:00
    lunes, 26 de marzo de 2018 6:43
    Moderador

Todas las respuestas

  • Nunca me ha pasado, pero lo que veo allí es un buffer que será igual al tamaño del archivo.  Si hace un buffer de 100MB de RAM, pues tal vez por ahí ande el problema.

    Lo que debe hacer es usar un buffer pequeño y escribir en un bucle.

    IMPORTANTE:  Este foro puede dar formato a código.  SIEMPRE publique su código con formato porque es más fácil de leer y entender.  Es el botón en el editor que tiene el símbolo <>.

    FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("address del ftp");
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.Credentials = new NetworkCredential("nombre de usuario", "contraseña");
    request.UsePassive = true;
    request.UseBinary = true;
    request.KeepAlive = true;                        
    using (FileStream stream = File.OpenRead("ruta del archivo a subir"))
    {
        byte[] buffer = new byte[4194304]; //4MB de buffer.
        int bytesRead = 0;
        int streamPos = 0;
        Stream reqStream = request.GetRequestStream();
        do
        {
            bytesRead = stream.Read(buffer, streamPos, buffer.Length);
            reqStream.Write(buffer, streamPos, bytesRead);
            streamPos += bytesRead;
        } while (bytesRead > 0);
        reqStream.Flush();
        reqStream.Close();
    }


    Jose R. MCP
    Code Samples

    domingo, 25 de marzo de 2018 22:43
    Moderador
  • Muchas gracias por tu respuesta amigo. Sin embargo este código que me sugieres me manda la siguiente excepción "El desplazamiento y la longitud están fuera de los límites para esta matriz o el recuento es superior al número de elementos desde el índice al final de la colección de origen."

    lunes, 26 de marzo de 2018 3:42
  • hola

    creo que para subir archivos grandes debes cambiar la forma en como envias el stream del file

    C# How to upload large files to ftp site

    leer el archivo completo y enviarlo no aplica

    analiza como usa el while para crear un buffer, para enviar de a bloques el archivo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 26 de marzo de 2018 3:50
  • Ah ok.  Parece que cometí el error de confundir parámetros.  Soy de la vieja escuela y escribí el código sin verificar.

    Primero esta línea:

    bytesRead = stream.Read(buffer, 0, buffer.Length);

    Luego esta línea:

    reqStream.Write(buffer, 0, bytesRead);


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Carlos78f martes, 27 de marzo de 2018 2:00
    lunes, 26 de marzo de 2018 6:43
    Moderador
  • Gracias amigo, ya me resultó.....y gracias a los demás.
    martes, 27 de marzo de 2018 2:00