Autor Beitrag
MeRo
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 19.02.11 00:22 
Hey zusammen,
ich habe mir ein kleines Programm gebastelt in dem in u.a. eine Datei auf meinen FTP Server hoch und wieder runter lade. Der Upload läuft über einen Button. Doch wenn ich den Button mehrfach nutze funktioniert er nach dem ersten benutzen nicht mehr. Hier mal mein Code:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
        public void speichernOnline()
        {
            //Ein Request erstellen an den ftp Server
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri + file);
            //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(userid, passwort);
            try
            {
                //Versuch eine Verbindung zu erstellen und eine Antwort zu erhalten
                WebResponse response = request.GetResponse();
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.ToString());
            }
            //Neuer FileStream erstellen für die Datei
            FileStream fs = new FileStream(saveFile, 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(); 
        }


Wie ihr vlt anhand der Kommentare erkennen könnt, habe ich den Code nicht selbst geschrieben sondern mehreren Tutorials entnommen. Kann mir jemand sagen warum der Upload nur beim ersten Aufruf funktioniert und am besten auch wie ich es behebe?
Dazu auch gleich meine 2. Frage. Nach dem Upload möchte ich gerne eine Meldung wie z.B. "Upload erfolgreich!" ausgeben. Nur leider weiß ich nicht anhand welches Kriteriums ich das ausgeben lassen kann. Im Moment mache ich es über:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
        private void sichern_Click(object sender, EventArgs e)
        {
            speichernString();
            speichernLokal();
            speichernOnline();
            MessageBox.Show("Speichervorgang erfolgreich!");
        }


Das ist natürlich nicht richtig. Aber so habe ich wenigstens eine Meldung wenn es durchgelaufen ist. Aber die Meldung kommt auch wenn o.g. Fehler auftritt (was ja logisch ist). Weiß vlt auch jemand wie ich überprüfen kann ob der Upload erfolgreich war?


Vielen Dank im Vorraus

MeRo
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Sa 19.02.11 12:28 
Hallo,

ich denke, der Upload funktioniert nur beim ersten mal, da die Datei dann auf dem Server vorhanden ist, und nicht mal so einfach überschrieben wird. Deswegen bekommst Du eine Exception zurück.

Wenn ich das richtig verstanden habe, willst Du mehrere Dateien innerhalb der einen Methode zum Server hochladen, oder? Das ist nicht wirklich gut. Denn erstens ist dann die Methode nicht wiederverwendbar, und zweitens muss für jeden neuen Upload auch ein neues FtpWebRequest-Objekt erzeugt werden. Warum übergibst Du denn der Methode nicht einfach einen string, wo der Pfad der hochzuladenen Datei drin steht? Und das Try-Catch würde ich nicht in der Methode lassen. Denn dann bekommst Du von aussen nicht mit, wenn ein Fehler aufgetreten ist. Ausser, Du wirfst die Exception weiter.
Und dann kannst Du also, wenn Du eine Liste an Dateien hast, die hochgeladen werden soll, die Liste durchgehen, die Methode immer wieder aufrufen und dort die Fehlerbehandlung betreiben.

Achso, habe Dein Codebeispiel nicht wirklich zum laufen gekriegt. Hier nochmal ein Beispiel, was so funzt:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
public void SaveFileOnFtpServer(string filename)
{
  FtpWebRequest request = (FtpWebRequest)WebRequest.Create(string.Format("ftp://localhost/{0}", Path.GetFileName(filename)));
  request.Method = WebRequestMethods.Ftp.UploadFile;
  request.Credentials = new NetworkCredential(username, passwort);
  byte[] fileContents = null;
  using (FileStream fs = new FileStream(filename, FileMode.Open))
  {
    fileContents = new byte[fs.Length];
    fs.Read(fileContents, 0, Convert.ToInt32(fs.Length));
  }
  request.ContentLength = fileContents.Length;
  using (Stream requestStream = request.GetRequestStream())
  {
    requestStream.Write(fileContents, 0, fileContents.Length);
    requestStream.Close();
  }
}
LG, Marko

Für diesen Beitrag haben gedankt: MeRo
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 19.02.11 13:03 
Wobei dir klar sein muss, dass du die FTP-Zugangsdaten dem Benutzer so auf dem Silbertablett schenkst. Insofern ist so ein Programm für die Weitergabe wohl kaum geeignet.

Für mich liest sich das so als würdest du eher ein PHP Skript benötigen, über das du dann via HTTP ganz normal Daten mit dem Server austauschen kannst...
MeRo Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 19.02.11 13:39 
Hey ihr beiden,
ich erkläre gerade mal das ganze "Programm", dann ist es vlt einfacher zu verstehen.
Ich habe in meiner GUI mehrere Formulare und CheckBoxen. Den Inhalt dieser speichere ich in einem String und "exportiere" ihn dann als Datei lokal auf meine Festplatte. Anschließend lade ich diese lokal gespeicherte Datei mit o.g. Code auf meinen FTP. Diese 3 Schritte (Inhalt -> String, String lokal speichern und Datei hochladen) führe ich mti dem unteren meiner beiden Code Teile aus. Jedes mal wenn man nun auf den erwähnten Button klickt wird der Inhalt in den String geschrieben, dieser lokal gespeichert und anschließend hochgeladen. Immer nur 1 Datei! Nachdem man nun die Daten mit dem "Speichern" Button hochgeladen hat, kann man ja wieder was an den Formularen ändern und möchte es ggf. erneut hochladen. Also klickt man erneut auf den "Speichern" Button, doch beim 2. (, 3., 4.,...) Versuch läd das Programm nichts hoch. Wenn man nun aber das Programm schließt und neu startet kann man wieder 1 mal etwas hochladen. Beim 2. mal passiert wieder nichts.
Hoffe jetzt ist etwas klarer geworden wo mein Problem liegt.
@Trashkid2000: Deinen Code werde ich gleich mal mit meinem vergleichen und dann testen, vlt komme ich ja damit weiter. Dankeschön.

Zu der Sache mit den FTP Zugangsdaten, darüber habe ich auch schon nachgedacht. Und da ich nicht so viel Ahnung davon habe, habe ich einen recht einfachen Weg gewählt. Ich habe mir einen neuen FTP Zugang angelegt, welcher nur Zugriff auf den einen Ordner mit dieser einen Datei hat. Also selbst wenn einer meiner Freunde (an welche ich das PRogramm nur geben möchte) den Code wie "zurückbaut" (weiß den Namen dafür immer noch nicht *schäm*)hätte er zwar die Zugangsdaten, aber könnte damit nicht groß was anfangen außer diese eine Datei zu löschen was nun nicht so dragisch wäre.

Vlt kann mir jetzt jemand helfen und verraten wie ich diesen Upload nun mehrfach hintereinander benutzen kann.


Schonmal vielen Dank

MeRo
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 19.02.11 13:42 
user profile iconMeRo hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe mir einen neuen FTP Zugang angelegt, welcher nur Zugriff auf den einen Ordner mit dieser einen Datei hat. Also selbst wenn einer meiner Freunde (an welche ich das PRogramm nur geben möchte) den Code wie "zurückbaut" (weiß den Namen dafür immer noch nicht *schäm*)hätte er zwar die Zugangsdaten, aber könnte damit nicht groß was anfangen außer diese eine Datei zu löschen was nun nicht so dragisch wäre.
Das geht sehr einfach, dafür muss man den Code noch nicht einmal dekompilieren. Öffne die Exe einfach im normalen Windows Editor, da stehen die Daten vermutlich im Klartext.

Die Gefahr ist eher, dass jemand irgendeine urheberrechtlich geschützte Datei hochlädt und darüber verteilt. Und das kann dann für dich richtig teuer werden...

Deshalb mach es lieber richtig. Mit einem serverseitigen Skript.

Für diesen Beitrag haben gedankt: MeRo
MeRo Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 19.02.11 14:17 
Hmm da sind wir wieder bei der Sache dass ich mich damit nicht auskenne -.-
Wie wäre es denn wenn ich beim drücken des "Speichern" Buttons ein Fenster aufpoppen lasse in dem man dann ein Passwort eingeben muss? Wäre das nicht eine Lösung? Es bietet zwar nicht sehr viel mehr Sicherheit da das Programm wie schön erwähnt nur für meine Freunde ist und wenn es dann in fremde Hände gelangt ist die Chance dass auch dass PW in fremde Hände gelangt sehr groß...