[C#] FTP Upload mit Berechtigungen

Raven280438

Erfahrenes Mitglied
Hi,

ich möchte eine Datei auf einen FTP-Server hochladen. Dass das mit
Code:
request.Method = WebRequestMethods.Ftp.UploadFile;
geht weis ich.

Wie kann ich aber die Berechtigungen und den Owner der Datei setzen?


Gruß
 
Hallo Raven,

das wird aus sicherheitsgründen Serverseitig realisiert. Die Berechtigungen werden vom auf dem FTP-Server eingeloggten User übernommen. Wenn Du unterschiedliche User verwenden möchtest, muss der FTP-Server diese "kennen" und Du musst Dich entsprechend einloggen und dann die Datei hochladen.

OT:
Btw, bist Du bei deinem [thread=377868]SOAP-Problem[/thread] schon weiter gekommen?
 
Hi,

gibt es da keine Möglichkeit die Berechtigung zu ändern? Ich hab ein Tool mit dem man ein FTP-Backup erstellen kann. Da gibt es auch Dateien die root gehören, oder CHMOD 0777 haben. Wenn ich das Backup wieder einspiele, muss das ja wieder zurückgesetzt werden.

Wäre das mit ner WinSocket Verbindung möglich (Hab noch nich so viel Ahnung von C#, gibts sowas überhaupt? Komme eher aus de PHP/C++ Ecke ;))


OT:
Ne damit bin ich nicht weiter gekommen. Hab mit dem Admin gesprochen, das ist kein richtiger SOAP Server, nur sowas selbst gebautes. Ich hab jetzt den Umweg über eine PHP-API genommen, die noch angeboten wird ;)


Gruß
 
Zuletzt bearbeitet:
Hi,

bei dem Link Changing Permissons of FTP'ed File gibts einen VB.NET Schnippsel der mit einer TCP Connection arbeitet.

Den werd ich mir mal anschauen und probieren un C# zu übertragen ;)
Auch wenn meine Ausbildung (in der ich ein bisschen VB programmiert hab) schon lange zurück liegt ...


Gruß
 
Fein, wichtig sind ja nur die Klassen und Methoden die verwendet werden. Dein Ergebnis kannst Du dann gerne hier (und für die Nachwelt) posten. Vielleicht kann man das dann gemeinsam noch etwas optimieren... :)
 
Hi,

ich hab mir jetzt mit Hilfe des VB-Codes eine Klasse gebaut:
Code:
    public class CFTP
    {
        public TcpClient tcpClient = null;
        public bool TcpConnected = false;
        public bool TcpLoggedin = false;
        private NetworkStream netStream = null;

        public String Domain = null;
        public int Port = 21;
        public String User = null;
        public String Pass = null;

        public CFTP(String hostname, int port=21)
        {
            this.tcpClient = new TcpClient(hostname, port);

            this.Domain = hostname;
            this.Port = port;

            String response = this.GetResponse("Hello");
            if (response.Substring(0, 3) == "220")
            {
                this.TcpConnected = true;
            }
            else
            {
                this.TcpConnected = false;
                throw new Exception("Es konnte keine Verbindung zum FTP-Server hergestellt werden!");
            }
        }

        public void Close()
        {
            if (this.netStream != null)
            {
                this.netStream.Close();
                this.netStream = null;
            }
            if (this.tcpClient != null)
            {
                this.tcpClient.Close();
                this.tcpClient = null;
            }
        }

        public bool Login(String user, String pass)
        {
            this.User = user;
            this.Pass = pass;

            if (this.TcpLoggedin == true)
            {
                //schon verbunden
                return true;
            }

            if (this.TcpConnected == true)
            {
                this.GetResponse("USER " + this.User);
                this.GetResponse("USER " + this.User);
                String response = this.GetResponse("PASS " + this.Pass);
                if (response.Substring(0, 3) == "230")
                {
                    this.TcpLoggedin = true;
                    return true;
                }
                else
                {
                    this.TcpLoggedin = false;
                    throw new Exception("Login oder Password falsch!");
                }
            }

            return false;
        }

        public String GetResponse(String command)
        {
            this.netStream = this.tcpClient.GetStream(); /* TODO: Hier Socket Fehler ... */

            if (this.netStream.CanWrite)
            {
                Byte[] sendBytes = Encoding.UTF8.GetBytes(command);
                this.netStream.Write(sendBytes, 0, sendBytes.Length);
            }
            else
            {
                //cannot write
                this.netStream.Close();
                return null;
            }

            if (this.netStream.CanRead)
            {
                Byte[] bytes = new Byte[this.tcpClient.ReceiveBufferSize];
                this.netStream.Read(bytes, 0, this.tcpClient.ReceiveBufferSize);

                String returndata = Encoding.ASCII.GetString(bytes);

                this.netStream.Close();

                return returndata;
            }
            else
            {
                //cannot read
                this.netStream.Close();
                return null;
            }
        }

Leider funktioniert das noch nicht so richtig...

Der Connect (im Konstruktor) funktioniert. Beim Login gibt es aber dann eine Exception in der Zeile
Code:
this.netStream = this.tcpClient.GetStream();
:
Der Vorgang ist für nicht verbundene Sockets unzulässig.
Ich habe die Vermutung, dass die Verbindung nach dem Connect irgendwie wieder zugemacht wird, ich weis nur nicht wo und warum.

Kann mir jemand weiterhelfen?


Gruß
 
Hallo,

dein Client muss sich erst connecten zum Server bevor du dir den Stream holen kannst..
Das passiert nicht mit dem Konstruktor der Client Klasse.
C#:
...
TcpClient client = new TcpClient();
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("deine IP"), "dein Port"); 
client.Connect(serverEndPoint);
...
 
HI,

danke für die Antwort. Ich dachte das connecten geschieht automatisch, wenn ich bei new TcpClient einen Hostnamen und Port angeben.

Werd ich morgen gleich mal ausprobieren...


Gruß
 
Zurück