Laden...

Problem beim Upload von 26mb großer Datei

Erstellt von Elront17 vor 14 Jahren Letzter Beitrag vor 14 Jahren 4.554 Views
E
Elront17 Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren
Problem beim Upload von 26mb großer Datei

Hallo,
Ich habe ein Pogramm gemacht, dass eine Datei mittels dieser Funktion uploaden soll:

private void SaveOnFtP(string DateiPfad,string DiraufServer,string DateiNameaufServer,string Passwort,string BenutzerName)
        {

            //Ein Request erstellen an den ftp Server
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(DiraufServer + DateiNameaufServer);

            //Die Methode angeben um eine Datei hochzuladen
            request.Method = WebRequestMethods.Ftp.UploadFile;

            //Berechtigungsdetails setzen vom ftp Server durch Username und Passwort
            request.Credentials = new NetworkCredential(BenutzerName, Passwort);

            //Versuch eine Verbindung zu erstellen und eine Antwort zu erhalten
            WebResponse response = request.GetResponse();

            //Neuer FileStream erstellen für die Datei
            FileStream fs = new FileStream(DateiPfad, FileMode.Open);
            byte[] fileContents = new byte[fs.Length];
            fs.Read(fileContents, 0, Convert.ToInt32(fs.Length));
            fs.Flush();
            fs.Close();

            //Ein neuen Stream für den Request erstellen dem der FileStream mitgegeben wird.
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(fileContents, 0, fileContents.Length);
            requestStream.Close();

            //Verbindung abbschliessen
            request.Abort();
        }

Diese Mehtode hat bisher immer funktioniert, doch bei meinem derzeitigen Programm kommt bei " requestStream.Close();" die Fehlermeldung:

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

Die Ausnahmedeteils sind:


System.Net.WebException wurde nicht behandelt.
  Message="Die zugrunde liegende Verbindung wurde geschlossen: Unbekannter Fehler beim Empfangen.."
  Source="System"
  StackTrace:
       bei System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
       bei System.Net.FtpWebRequest.RequestCallback(Object obj)
       bei System.Net.CommandStream.InvokeRequestCallback(Object obj)
       bei System.Net.CommandStream.Abort(Exception e)
       bei System.Net.CommandStream.CheckContinuePipeline()
       bei System.Net.FtpWebRequest.DataStreamClosed(CloseExState closeState)
       bei System.Net.FtpDataStream.System.Net.ICloseEx.CloseEx(CloseExState closeState)
       bei System.Net.FtpDataStream.Dispose(Boolean disposing)
       bei System.IO.Stream.Close()
       bei WindowsFormsApplication1.Form1.SaveOnFtP(String DateiPfad, String DiraufServer, String DateiNameaufServer, String Passwort, String BenutzerName) in D:\Eigene Dateien\Visual Studio 2008\Projects\informer\informer\Form1.cs:Zeile 145.
       bei WindowsFormsApplication1.Form1.Form1_Load(Object sender, EventArgs e) in D:\Eigene Dateien\Visual Studio 2008\Projects\informer\informer\Form1.cs:Zeile 76.
       bei System.Windows.Forms.Form.OnLoad(EventArgs e)
       bei System.Windows.Forms.Form.OnCreateControl()
       bei System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
       bei System.Windows.Forms.Control.CreateControl()
       bei System.Windows.Forms.Control.WmShowWindow(Message& m)
       bei System.Windows.Forms.Control.WndProc(Message& m)
       bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       bei System.Windows.Forms.ContainerControl.WndProc(Message& m)
       bei System.Windows.Forms.Form.WmShowWindow(Message& m)
       bei System.Windows.Forms.Form.WndProc(Message& m)
       bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       bei System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
       bei System.Windows.Forms.Control.SetVisibleCore(Boolean value)
       bei System.Windows.Forms.Form.SetVisibleCore(Boolean value)
       bei System.Windows.Forms.Control.set_Visible(Boolean value)
       bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       bei System.Windows.Forms.Application.Run(Form mainForm)
       bei WindowsFormsApplication1.Program.Main() in D:\Eigene Dateien\Visual Studio 2008\Projects\informer\informer\Program.cs:Zeile 18.
       bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       bei System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

Ich wiess nicht was ich machen soll! Ich glaube, da die Methode immer funktioniert hat, nur bei dieser großen (26mb) Datei nicht geht, das es villeicht damit etwas zu tun hat, dass die Datei zu groß ist. An einer Upload begrenzung des Servers kann es nicht liegen, da ich die Datei mit Fillezilla ohne Probleme hochladen kann. (Die Datei ist eine xml Datei).

Danke schomahl im Vorraus.

Ich habe jetzt versucht um die ganze funktion eine try caatch zu machen und es ging. Doch er lud nur 8 der 26 mb hoch, dannach hörte er auf.

Wuhuu Simpsons!

Gelöschter Account
vor 14 Jahren

ich glaube das hat was mit der dauer der übertragung und dem ftp server standard verhalten zu tun. der schliesst die verbindung nach n sekunden
wenn kein neues kommando kommt. da das alte kommando ja sehr lange läuft bei nem 26mb upload hat der server die verbindung bereits automatisch geschlossen.
die bestehende übertragung interessiert das nicht weiter, die läuft trotzdem noch durch. zumindest läuft das mit meinem ftp client und ftp server (beides filezilla) so.
schau mal ob filezilla da neben dem upload noch dummy kommandos absetzt während der gesamten übertragung.

E
Elront17 Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren

Wie meinst du ich soll mir in Fillezilla anschauen ob es dummycomandos absetzt ?
Ich kann doch da nicht einfach in den Quellcode von Fillezilla schauen ? und das ist dann sicher auch nicht c#, oder wenigstens was ähnliches. Sag mahl genauer wie du menst bitte.

Wuhuu Simpsons!

925 Beiträge seit 2004
vor 14 Jahren

Du kannst dir das Command-Log im Filezilla doch life anschauen. Da müsstest du sehen können, ob der irgendwelche Commands versendet, während die Übertragung läuft.

Bedenke, dass es bei FTP meistens mehrere Verbindungen zwischen Server und Client gibt.

Falls nicht, dann ignoriert der Filezilla am Ende der Übertragung einfach die Tatsache, dass der Stream bereits geschlossen ist. Oder er überprüft dies und schließt den Stream nicht mehr selbsttätig.

Kommt die Datei denn nicht trotz der Fehlermeldung beim Close in deinem Programm vollständig an?

E
Elront17 Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren

Er brucht nach 9 mb ab und geht zur nächsten datei die er uploadeen soll. Das kann an dem Try Catch liegen, dass ich um die uploadfunktion gelegt habe. Aber ohne das try catch gibt es eine Fehlermeldung, wo man dann weiter drücken muss, und das will ich eigentlich dan in einem fertigen programm nicht haben. Zumal ich nichteinmahl weiss ob es dann funktioniert.
Filezilla gibt nach meiner iterpretation keine zusätzlichen befehle aber ich kann mich irren, hier das Log:

Status: Verbunden
Status: Starte Upload von D:\Eigene Dateien\Visual Studio 2008\Projects\informer\informer\bin\Debug\C2.xml
Befehl: CWD /tf/programmtests/521366
Antwort: 250 OK. Current directory is /tf/programmtests/521366
Befehl: TYPE A
Antwort: 200 TYPE is now ASCII
Befehl: PASV
Antwort: 227 Entering Passive Mode (217,196,177,116,240,72)
Befehl: STOR C2.xml
Antwort: 150 Accepted data connection
Antwort: 226-File successfully transferred
Antwort: 226 282.013 seconds (measured here), 95.09 Kbytes per second
Status: Dateitransfer erfolgreich
Status: Empfange Verzeichnisinhalt...
Befehl: TYPE I
Antwort: 200 TYPE is now 8-bit binary
Befehl: PASV
Antwort: 227 Entering Passive Mode (217,196,177,116,140,142)
Befehl: MLSD
Antwort: 150 Accepted data connection
Antwort: 226-ASCII
Antwort: 226-Options: -a -l
Antwort: 226 11 matches total
Status: Anzeigen des Verzeichnisinhalts abgeschlossen

Hatte denn noch keiner das Problem, das er zu große Daten hochladen musste ?

Wuhuu Simpsons!

Gelöschter Account
vor 14 Jahren

schau mal nicht so sehr auf die menge sondern miss mal die zeit wann er abbricht.
bricht er z.b. immer nach 60 sekunden ab?

dein ftp client zeigt dir sicher eine console an was er für kommandos wann absetzt, da schau mal meinte ich. hast du ja auch gemacht seh ich gerade.
noch stylischer wäre wenn du den filezilla ftp server installierst(kostet nix und funktioniert super) dann kannst du es auch von server seite mit dem dem mitgelieferten admin interfache beobachten was passiert und kannst den ftp client gut gegen deinen code analysieren.

E
Elront17 Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren

Er bringt den Fehler genau nach 00.01:40.2773296 (1min 40 sec 277...millisec)
Aber mit dem Fillezillaserver installieren. Kann man da wirklich vom gleichen Rechner mit dem Client auf den Server zugreifen ?
Ausserdem weiss ich noch, dass ich schonmahl versucht habe bei mir einen Filezillaserver zu installen aber ich habe ihn nicht einrichten können. (war warscheinlich zu blöd) Deshalb würde ich dies nur ungern machen.

Weiss niemand wie das geht ? Das wird doch schonmahl jemand gemacht haben! (also so nen großen(langen) upload).

Wuhuu Simpsons!

Gelöschter Account
vor 14 Jahren

Klar kannst du auf den gleichen Rechner zugreifen. Rate mal: 127.0.0.1 😄
Mir fällt einfach nicht ein wie man dem sonst auf die Spur kommen kann.
Das Problem wird sein das du eine grössere Datei uploaden musst um auf 1:40 Übertragunsdauer zu kommen aber das sollte sich machen lassen.

S
8.746 Beiträge seit 2005
vor 14 Jahren

1.GetResponse() ausführen, nachdem du den RequestStream geschlossen hast
2. Das Abort() am Ende verursacht deinen Absturz. Du schiesst dir die Verbdindung selbst ab.

E
Elront17 Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren

Wie meinst du das ?
Kannst du mir das anhand meines Codes erklären ? Ich bin nämlich wenn es um ftp geht nicht der erfahrenste. 🙁 Ich habe versucht einfach das request.abord(); auszukommentieren aber dann passiert genau das gleiche.
Den Ftp Code habe ich nähmlich auch nur aus dem Forum ^^.

Wuhuu Simpsons!

S
8.746 Beiträge seit 2005
vor 14 Jahren

Am besten mal ein Beispiel angucken:

http://msdn.microsoft.com/en-us/library/ms229715.aspx

E
Elront17 Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren

Ich habe jetzt es so gemacht wie es in diesem Beispiel war und tata... es läd eine Sekunde länger hoch 😉.
Naja aber sonst gab es genau den gleichen fehler. Villeicht verstehe ich aber auch nicht wie du meinst. Ich habe es jetzt mit diesem Code versucht:

private void SaveOnFtP(string DateiPfad, string DiraufServer, string DateiNameaufServer, string Passwort, string BenutzerName)
        {
            Stopwatch stopuhr = new Stopwatch();
            stopuhr.Start();
            //Eine neue Datei erstellen und lokal speichern (Beispiel hier: Textfile)
            //StreamWriter w = new StreamWriter("C://Beispiele/MyFile.txt", true);
            //w.WriteLine("BlaBlaBla");
            //w.Close();
            try
            {
                
                //Ein Request erstellen an den ftp Server
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(DiraufServer + DateiNameaufServer);

                //Die Methode angeben um eine Datei hochzuladen
                request.Method = WebRequestMethods.Ftp.UploadFile;

                //Berechtigungsdetails setzen vom ftp Server durch Username und Passwort
                request.Credentials = new NetworkCredential(BenutzerName, Passwort);

                StreamReader sourceStream = new StreamReader(DateiPfad);
                byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
                sourceStream.Close();
                request.ContentLength = fileContents.Length;

                Stream requestStream = request.GetRequestStream();
                requestStream.Write(fileContents, 0, fileContents.Length);
                requestStream.Close();

                FtpWebResponse response = (FtpWebResponse)request.GetResponse();

                MessageBox.Show("Upload File Complete, status {0}", response.StatusDescription);

                response.Close();
                MessageBox.Show("fertig");
            }
            catch { stopuhr.Stop(); MessageBox.Show("elapsed: " + stopuhr.Elapsed.ToString() + "r/n/ elapsed milli: " + stopuhr.ElapsedMilliseconds.ToString() + "r/n/ elapsed ticks: " + stopuhr.ElapsedTicks.ToString()); }
        }

Wuhuu Simpsons!

E
Elront17 Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren

Bitte helft mir X(
Irgendjemand muss doch wissen wiee man größere Dateien hochlädt. Bitte bitte bitte 🙁

Wuhuu Simpsons!

S
8.746 Beiträge seit 2005
vor 14 Jahren

Portfreigaben prüfen (20+21), Server-Konfig (ob PASV erlaubt). GGf. einfach mal einen anderen Server ausprobieren.

S
401 Beiträge seit 2008
vor 14 Jahren

Hallo,

nach deinem Code gehe ich mal von einer synchronen Nutzung aus. Ansonsten solltest du dir das KeepAlive - Property ansehen.

Ansonsten ein paar Tips, mit denen du etwas Licht ins Dunkel bringst.
1.) Welchen Wert liefert FtpWebRequest.Timeout und ReadWriteTimeout?
2. ) " .UsePassive ?
3.) Warum erstellst du eine Verbindung zum Server und lädst dann die Daten von der Festplatte? Ich würde das bei großen Datenmengen asynchron durchführen. Bei kleinen, so wie bei dir, zu erst laden und dann die Verbindung mit den Server aufbauen.
4.) Wie sieht es mit einem anderen Server im Web bzw. Intranet aus. Im Intranet begrenzt du am besten die LAN-Geschwindigkeit, z.B. auf ein 56K - Modem und probierst das später nicht mit einer hohe Serverlast. Hierzu bietet Apache ein Java-Programm kostenlos an.

Gruß,
Thomas