Laden...

FTP: Upload unvollständig

Erstellt von bammes vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.367 Views
B
bammes Themenstarter:in
9 Beiträge seit 2012
vor 9 Jahren
FTP: Upload unvollständig

Hi,

ich lade auf einem externen FTP-Server eine Datei hoch.
Das Resultat, welches am Server ankommt ist nicht komplett das selbe, was ich Losgeschickt habe.

FtpWebRequest client = (FtpWebRequest)WebRequest.Create("ftp://" + this.Host + "/" + this.Name);
client.Credentials = new NetworkCredential(this.username, this.password);
client.Method = WebRequestMethods.Ftp.UploadFile;

Stream uploadStream = client.GetRequestStream();
FileStream fileStream = new FileStream(this.path, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[1024];

while(fileStream.Position < fileStream.Length)
{
    this.State = Math.Round((double)fileStream.Position / (double)fileStream.Length * 100d, 2);
    int length = fileStream.Read(buffer, 0, buffer.Length);
    uploadStream.Write(buffer, 0, length);
}

Kann es sein, dass die Daten auf dem Weg verfälscht werden?

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo bammes,

Das Resultat, welches am Server ankommt ist nicht komplett das selbe, was ich Losgeschickt habe.

was genau ist unterschiedlich?

ich lade auf einem externen FTP-Server eine Datei hoch.

Im deinem Code ist nicht zu erkennen, dass du die Streams schließt. Am besten du verwendest für beide Streams die using-Anweisung. Dann kann das gar nicht vergessen werden, selbst im Fehlerfall nicht.

herbivore

3.170 Beiträge seit 2006
vor 9 Jahren

Hallo,

einfacher geht's mit WebClient.UploadFileAsync. Dann noch das UploadProgressChanged abonnieren für den Fortschritt.

Ich frage mich, was der FtpWebRequest an sich hat, das ihn so beliebt macht. WebClient ist fast immer die bessere Variante.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

B
bammes Themenstarter:in
9 Beiträge seit 2012
vor 9 Jahren

Den Unterschied habe ich angehängt.
Das erste Bild ist mit dem ftpWebRequest das zweite mit den WebClient.
Beide sehen sogar gleich falsch aus.

Am Server kanns kaum liegen, da ich mit Filezilla sauber alle Daten laden kann.

Edit (neuer Code):

WebClient wc = new WebClient();
                    wc.Credentials = new NetworkCredential(this.username, this.password);
                    wc.UploadFileAsync(new Uri("ftp://" + this.Host + "/" + this.Name), this.path);

                    wc.UploadProgressChanged += (sender, e) =>
                    {
                        this.State = e.ProgressPercentage;
                    };

                    wc.UploadFileCompleted += (sender, e) =>
                    {...};

edit:

Die Bilder haben nach dem Upload immer die selben Fehler

Hinweis von herbivore vor 9 Jahren

Der Dateianhang wurde vom Benutzer entfernt. Er zeigte ein JPG Bild, das allem Anschein nach am Anfang korrekt dargestellt und nach ca. 1/3 wohl abgeschnitten war, was sich in entsprechenden bunten Artefakten darstellte.

849 Beiträge seit 2006
vor 9 Jahren

Hallo,

was passiert nachdem dieser Code durchgelaufen ist? Es ist keine Console die sich direkt danach beendet oder? Auch solltest Du dem Client zeit lassen seine Arbeit zu beenden bevor er von GC abgeräumt wird (Referenz halten).

Und vieleicht solltest Du deine Beispiel Bilder sorgfältiger aussuchen, da sie recht große ähnlichkeiten mit gewissen verbotenen Symbolen haben.

W
955 Beiträge seit 2010
vor 9 Jahren

Hallo bammes,

höre bitte auf herbivore und implementiere erst einmal IDisposable des Webclients.

B
bammes Themenstarter:in
9 Beiträge seit 2012
vor 9 Jahren

Es handelt sich um eine WPF Anwendung.
Ich lasse dem WebClient genug Zeit, da ich erst weitermache, wenn UploadFileCompleted gestartet wurde.

ich benutze den WebClient später weiter für andere Anfragen (Http).

Wenn ich fertig bin leere ich den WebClient dann mit Dispose()