Laden...

Fehler bei Ftp upload.

Erstellt von Rainer Wein vor 15 Jahren Letzter Beitrag vor 14 Jahren 9.668 Views
R
Rainer Wein Themenstarter:in
90 Beiträge seit 2008
vor 15 Jahren
Fehler bei Ftp upload.

Ich würde gern mehrere Datei per Ftp übertragen.


FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("ftp://test.de/" + test);
           

            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.Credentials = new NetworkCredential("test", "test");
            request.UsePassive = true;
            request.UseBinary = true;
            request.KeepAlive = false;

     
            for (int i = 0; i < upload_BMP_ARY.Length; i++)
            {
                upload_BMP_ARY[0].Save(Application.StartupPath + "\\" + test);
                FileStream stream = File.OpenRead(Application.StartupPath + "\\" + test);
                byte[] buffer = new byte[stream.Length];

                stream.Read(buffer, 0, buffer.Length);
                stream.Close();

                //Upload file
                Stream reqStream = request.GetRequestStream();
                reqStream.Write(buffer, 0, buffer.Length);
                reqStream.Close();
            }

Die Übertragung beginnt auch, aber bricht mitten im Upload ab.
(" Die zugrunde liegende Verbindung wurde geschlossen: Unbekannter Fehler beim Empfangen. ")
Wenn ich die Datei per FlashFXP übertrage funktioniert es.
Die zweite Frage ist, wie man mehrere Datein hintereinander uploaden kann.
So funktioniert es nicht.

S
341 Beiträge seit 2008
vor 15 Jahren

Servus,

hast du es schon mal im debug mode ausgeführt ?... bekommst sicher mehr fehler infos als nur unbekannter fehler.

als nächstes geb ich dir den tipp such mal im forum nach ftp biliotheken... du wirst fündig und da gibt es schon fertig implentierte funktionen zum üp und download... etc.

die musst du dann nur für jede datei ausführen.
(möglicher weise gibt es noch elegantere lösungen aber das wäre wohl die einfachste)

grüße

**Nur die Kenner können mit 10 Fingern bis 1023 zählen !!**
private int Main()
{
   string programmingSkills = getMySkills("programming")
   return = 1;
}
R
Rainer Wein Themenstarter:in
90 Beiträge seit 2008
vor 15 Jahren

Nein auch im Debug Modus bekomme ich keine weiteren Hinweise.
Ich möchte auch keine fertige Ftp Bibilothek nur für den Upload von ein paar Dateien
nehmen.
Eigenartig bei der Sache ist das wenn ich das Debugging nicht Beende der Upload trotz der Fehlermeldung fortgesetzt wird.

Es würde mich auch sehr interessieren welche elegante Lösung es für den Upload
von mehrern Dateien gibt.

D
222 Beiträge seit 2004
vor 15 Jahren

mit diesem Code funktioniert ist.
ich vermute mal es liegt daran das du dein Ftpwebrequest ausserhalb der schleife hast. verlager ihn mal in die schleife rein. dann sollte es gehen. Zudem wäre es ratsam, alle relevanten exceptions zu behandeln um fehlerfrei übertragen zu können bzw fehler überhaupt zu erkennen. grade bei streams und netzwerkverkehr gibts zuviele faktoren die dazwischen funken können.


            List<string> Dateien = new List<string>();
            Dateien.Add("C:\\PDA.jpg"); Dateien.Add("C:\\Roboter.jpg");
            for (int i = 0; i < Dateien.Count; i++) {
                FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("ftp://127.0.0.1/"+Path.GetFileName(Dateien[i]));
                request.Method = WebRequestMethods.Ftp.UploadFile;
                request.Credentials = new NetworkCredential("test", "test");
                request.UsePassive = true;
                request.UseBinary = true;
                request.KeepAlive = false;
                Console.Write("Upload Datei '"+Dateien[i]+"'...");
                FileStream stream = null; 
                try { stream = File.OpenRead(Dateien[i]); }
                catch (Exception d) { Console.WriteLine(d.Message); }
                if (stream!=null) {
                    byte[] buffer = new byte[stream.Length];
                    try { 
                        stream.Read(buffer, 0, buffer.Length);
                        //Upload file
                        Stream reqStream = null; 
                        try { reqStream = request.GetRequestStream(); }
                        catch (Exception e) { Console.WriteLine(e.Message); }
                        if (reqStream!=null) {
                            try { reqStream.Write(buffer, 0, buffer.Length); }
                            catch (Exception f) { Console.WriteLine(f.Message); }
                            reqStream.Close();
                        } else { Console.WriteLine(" NULL"); }
                        Console.WriteLine(" OK");                    
                    } catch (Exception d2) { Console.WriteLine(d2.Message); }                  
                }
            }

Ergebnis:
Upload Datei 'C:\PDA.jpg'... OK
Upload Datei 'C:\Roboter.jpg'... OK

R
Rainer Wein Themenstarter:in
90 Beiträge seit 2008
vor 15 Jahren

Danke schön, mit dieser Methode funktioniert es.

C
16 Beiträge seit 2008
vor 15 Jahren

Hallo,

ich habe den Code aus dem Beispiel aus dem vorletzten Eintrag nommen, da mein Code nicht so wie erwartet lief.

Allerdings überträgt mir auch diese Variante nicht meine Datei komplett. Zum Test nehme ich eine 340MB Datei welche nur bis zu maximal 280M erreicht bei der Übertragung. Danach bricht der Transfert ab

Desweiteren suche ich eine funktionierende Akternative mit einem asyncronen FTP Transfer.

MFG ch1ll4

D
222 Beiträge seit 2004
vor 15 Jahren

kommt eine fehlermeldung beim abbruch?

C
16 Beiträge seit 2008
vor 15 Jahren

//leider nicht.

Habe gerade doch eine Fehlermeldung bekommen:

Die zugrunde liegende Verbindung wurde geschlossen. Unbekannter Fehler beim Empfangen.

Allerdings sende ich doch (Upload)???

hatte es auch schon anders probiert:


      private void btUpload_Click(object sender, EventArgs e)
      {
         WebClient uploadclient = new WebClient();

         Uri myconn = null;
         if (tbUploadServer.Text.Contains("ftp://"))
            myconn = new Uri(tbUploadServer.Text + "/" + cbUploadPfad.Text + "/" + lbName.Text);
         else
            myconn = new Uri("ftp://" + tbUploadServer.Text + "/" + cbUploadPfad.Text + "/" + lbName.Text);

         try
         {
            uploadclient.Credentials = new NetworkCredential(tbUploadbenutzer.Text, tbUploadPasswort.Text);
            this.uploadclient.UploadProgressChanged +=new UploadProgressChangedEventHandler(uploadclient_UploadProgressChanged);
            this.uploadclient.UploadFileCompleted += new UploadFileCompletedEventHandler(uploadclient_UploadFileCompleted);
            this.uploadclient.UploadFileAsync(myconn, pfadname);
         }
         catch (Exception ex)
         {
            Messagebox.Show(ex.Message);
         }
}

      void uploadclient_UploadFileCompleted(object sender, UploadFileCompletedEventArgs e)
      {
         if (e.Error == null)
            MessageBox.Show("Upload erfolgreich durchgeführt.");
         else
            MessageBox.Show(e.Error.Message);
      }

So brach der Dateitransfer aber leider auch ab....

Ich habe so wie hier gerade auch den Download gestaltet. das funzt ohne Probleme. Auch mehreren GB großen Dateien...

Nur der Upload macht mir also Probleme...

D
222 Beiträge seit 2004
vor 15 Jahren
hm

nur sone idee aber schonma mit nem anderen ftpprogramm getestet ob du die datei hochladen kannst? nich das es eine serverseitige beschränkung im upload ist

C
16 Beiträge seit 2008
vor 15 Jahren

nur sone idee aber schonma mit nem anderen ftpprogramm getestet ob du die datei hochladen kannst? nich das es eine serverseitige beschränkung im upload ist

Ja. Geht ohne Probleme. Habs mehrmals getestet und nochmal den FTP Betreiber zb. eventueller Limitierungen gefragt...

D
222 Beiträge seit 2004
vor 15 Jahren

um explizit herauszufinden was letztendlich den abbruch verursacht, bleibt dir eigentlich nur den TCP Stack zu beobachten, sprich mit einem paketfilter zu beobachten warum er abbricht. alles andere wären ratespielchen.

C
16 Beiträge seit 2008
vor 14 Jahren

mittlerweile habe ich den fehler gefunden, aber noch nicht behoeben können...

Über UploadFileCompletedEventArgs e.Error kommt folgende Fehlermeldung:
" bei System.Net.FtpWebRequest.EndGetResponse(IAsyncResult asyncResult)\r\n bei System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result)\r\n bei System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result)"

Google konnte mir hierbei allerdings auch noch nicht weiterhelfen.

Es werden wenn man zb eine 300 MB Datei hochläd manchmal nur 70 MB hochgeladen, manchmal auch mehr. Bei kleineren Dateien taucht der Fehler nicht auf. Dann gibt es eine Schweigesekunde und dann wird das Error Event gestartet...

1.820 Beiträge seit 2005
vor 14 Jahren

Hallo!

@ch1ll4:
Ist jetzt nur eine Vermutung: Evtl. handelt es sich um ein Timeout-Problem, d.h. der Upload dauert so lange, dass fälschlicherweise ein Verbindungsfehler angenommen und der Upload abgebrochen wird. Kannst ja mal testen, ob der Abbruch immer innerhalb eine gewissen Zeitspanne auftritt.
Evtl. hilft es, den Timeout zu erhöhen (FtpWebRequest.Timeout).

EDIT: Sehe gerade, dass du mit WebClient arbeitest, dort kann man den Timeout anscheinend nicht anpassen. Also evtl. mal mit FtpWebRequest versuchen.

Nobody is perfect. I'm sad, i'm not nobody 🙁