FTP - Upload d'un fichier.

fdouieb Messages postés 264 Date d'inscription vendredi 12 décembre 2003 Statut Membre Dernière intervention 12 juin 2013 - 28 oct. 2007 à 08:33
raedPlanet Messages postés 1 Date d'inscription jeudi 10 décembre 2009 Statut Membre Dernière intervention 10 décembre 2009 - 10 déc. 2009 à 14:45
Bonjour,
 j'utilise le Framework 2 pour faire du FTP. Voici le code

        public bool FTPUpload(ProgressBar pBar, string sFTPServerIP, string sUserName, string sPassword, string sFTPPath, string sFileName, ref string sErreur)
        {
            FileInfo fileInf = new FileInfo(sFileName);

            FtpWebRequest reqFTP;
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + sFTPServerIP + "/" + sFTPPath + "/" + fileInf.Name));
            reqFTP.Credentials = new NetworkCredential(sUserName, sPassword);
            reqFTP.KeepAlive = false;
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
            reqFTP.UseBinary = true;

            int buffLength = 2048;
            byte[] buff = new byte[buffLength];
            int contentLen, iTotalLen;

            FileStream fs = fileInf.OpenRead();
            try
            {
                Stream strm = reqFTP.GetRequestStream();
                contentLen = fs.Read(buff, 0, buffLength);
                iTotalLen = contentLen;

                while (contentLen != 0)
                {
                    pBar.Value = (int)(100 * iTotalLen * Math.Exp(-Math.Log(fileInf.Length)));
                    strm.Write(buff, 0, contentLen);

                    contentLen = fs.Read(buff, 0, buffLength);
                    iTotalLen += contentLen;
                }

                strm.Close();
                fs.Close();
                return true;
            }
            catch (Exception ex)
            {

                fs.Close();
                sErreur = ex.Message;
                return false;
            }
        }

Ce code fonctionne bien lorsque je ne simule pas de coupure du serveur. Lorsque je simule une coupure, l'exception ce declanche et à l'appel du prochain upload (apres avoir remis le serveur FTP) il n'y a toujours pas de probleme. Je simule une deuxieme coupure et relance la methode (toujours apres avoir remis le serveur FTP) et la , l'application ce bloque a l'instrution "Stream strm = reqFTP.GetRequestStream();". Je ne peux plus recevoir d'info du serveur FTP.

Le bloquage apparait toujours apres la deuxieme coupure.

Si une personne a une idéé?

Merci d'avance

9 réponses

cs_niky Messages postés 168 Date d'inscription jeudi 28 juin 2001 Statut Membre Dernière intervention 18 octobre 2008 7
28 oct. 2007 à 16:39
Salut,

C'est peut être con ce que je vais dire mais au cours de tes deux "plantages", tu dois probablement garder une connexion ouverte à chaque fois.
Si à la suite de fs.Close tu fais reqFTP.Dispose ou reqFTP.Close (il doit y avoir au moins l'un des deux), tu auras du coup fermé tes connexions.

Si je dis ça c'est parce que, par défaut, le framework .Net limite le nombre de connexion à 2.
0
fdouieb Messages postés 264 Date d'inscription vendredi 12 décembre 2003 Statut Membre Dernière intervention 12 juin 2013 3
29 oct. 2007 à 09:33
Avant tout, merci de prendre de ton temps pour répondre à ma
question.


Je comprends  très bien ce que tu dis,
mais le problème c'est que les instructions que tu propose n'existent pas.<!--[if gte vml 1]><v:shapetype
id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="Image_x0020_1" o:spid="_x0000_i1025" type="#_x0000_t75"
alt="http://www.csharpfr.com/imgs2/smile_blush.gif" style='width:11.25pt;
height:11.25pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:\WinTmp\msohtmlclip1\01\clip_image001.gif"
o:title="smile_blush"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->












 
0
cs_niky Messages postés 168 Date d'inscription jeudi 28 juin 2001 Statut Membre Dernière intervention 18 octobre 2008 7
29 oct. 2007 à 15:11
Toutes mes excuses, ça n'existe effectivement pas !
Par contre, quand une exception se produit, tu ne fermes pas strm. Le fermer revient à faire ce que je proposais précédemment mais c'est strm qu'il faut fermer et pas reqFTP. Sorry...

A voir si ça peut solutionner ton problème...
0
fdouieb Messages postés 264 Date d'inscription vendredi 12 décembre 2003 Statut Membre Dernière intervention 12 juin 2013 3
29 oct. 2007 à 16:12
tu ne peux pas fermer strm car c'est une variable locale du try et donc pas reconnu dans le catch.
Cependant, j'ai deplacé la variable de facon a ce qu'elle soit globale pour le try et le catch.
Au moment ou je fais strm.close() ou strm.Dispose() dans le catch, l'appli plante.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_niky Messages postés 168 Date d'inscription jeudi 28 juin 2001 Statut Membre Dernière intervention 18 octobre 2008 7
29 oct. 2007 à 19:05
Qu'est-ce que t'obtiens comme erreur ?
0
fdouieb Messages postés 264 Date d'inscription vendredi 12 décembre 2003 Statut Membre Dernière intervention 12 juin 2013 3
29 oct. 2007 à 19:15
Voici l'erreur

La connexion sous-jacente a été fermée : Une erreur inattendue s'est produite lors de la réception.

Il ne peux plus fermer la variable strm car il y a une coupure entre l'aplli et le serveur FTP
0
railarmenien Messages postés 4 Date d'inscription mercredi 11 octobre 2006 Statut Membre Dernière intervention 17 décembre 2009
11 nov. 2007 à 03:15
essai de fermer les stream dans un bloc finally.
0
halastorn Messages postés 2 Date d'inscription dimanche 3 décembre 2006 Statut Membre Dernière intervention 3 janvier 2008
3 janv. 2008 à 04:30
salut j'ai un probleme avec le GetRequestStream() j'obtient ceci
Le serveur distant a retourné une erreur : (550) Fichier non disponible (par exemple, fichier introuvable, accès impossible).
Merci de m'aider
0
raedPlanet Messages postés 1 Date d'inscription jeudi 10 décembre 2009 Statut Membre Dernière intervention 10 décembre 2009
10 déc. 2009 à 14:45
error 550 c'est l'authorisation FTP dans IIS
IIS ==> FTP ==> Right Click ==>Répertoire de Base ==> check Ecriure

Voila
0
Rejoignez-nous