Laden...

C# FTP Upload: Error 550: Access denied

Erstellt von dr.hardware vor 14 Jahren Letzter Beitrag vor 14 Jahren 7.384 Views
D
dr.hardware Themenstarter:in
7 Beiträge seit 2009
vor 14 Jahren
C# FTP Upload: Error 550: Access denied

Hallo, ich hoffe ich bin hier richtig.

ich habe ein Problem mit folgendem Code:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FtpLib;
using System.IO;

namespace Test
{
    
    public class Test
    {

        public static void Main()
        {

            try
            {

                Console.WriteLine("Starting...");

                FTPFactory ff = new FTPFactory();
                ff.setDebug(true);
                ff.setRemoteHost("xxxxxxxx");
                ff.setRemoteUser("xxxx");
                ff.setRemotePass("xxxxxxxx");
                ff.login();
                ff.chdir("html");
                

                StreamWriter myWriter = File.CreateText(@"c:\text1.txt");
                string[] fileNames = ff.getFileList("*.jpg");
                for (int i = 0; i < fileNames.Length; i++)
                {
                    Console.WriteLine(fileNames[i]);
                    myWriter.WriteLine(fileNames[i]);   // + ";"  + fileNames[i].CreationTime);
                }
                ff.setBinaryMode(true);
                ff.upload("c:\\test.txt");

                myWriter.Close();
                ff.close();
            }
            catch (Exception e)
            {
                Console.WriteLine("Caught Error :" + e.Message);
            }
            
        }
    }
}

Es funktioniert soweit alles, nur bekomme ich an der Stelle wo der Upload stattfinden soll einen Error 550: Access denied.

achja, folgendes braucht man auch noch:


/*
FTPFactory.cs
Better view with tab space=4

Written by Jaimon Mathew (jaimonmathew@rediffmail.com)
Rolander,Dan (Dan.Rolander@marriott.com) has modified the 
download
method to cope with file name with path information. He also 
provided
the XML comments so that the library provides Intellisense 
descriptions.

use the following line to compile
csc /target:library /out:FTPLib.dll /r:System.DLL FTPFactory.cs
\*/

using System;
using System.Net;
using System.IO;
using System.Text;
using System.Net.Sockets;

namespace FtpLib
{

   public class FTPFactory
   {

     private string 
remoteHost,remotePath,remoteUser,remotePass,mes;
     private int remotePort,bytes;
     private Socket clientSocket;

     private int retValue;
     private Boolean debug;
     private Boolean logined;
     private string reply;

     private static int BLOCK_SIZE = 512;

     Byte[] buffer = new Byte[BLOCK_SIZE];
     Encoding ASCII = Encoding.ASCII;

     public FTPFactory()
     {

       remoteHost  = "localhost";
       remotePath  = ".";
       remoteUser  = "anonymous";
       remotePass  = "jaimon@school2000.co.uk";
       remotePort  = 21;
       debug     = false;
       logined    = false;

     }

     ///
     /// Set the name of the FTP server to connect to.
     ///
     /// Server name
     public void setRemoteHost(string remoteHost)
     {
       this.remoteHost = remoteHost;
     }

     ///
     /// Return the name of the current FTP server.
     ///
     /// Server name
     public string getRemoteHost()
     {
       return remoteHost;
     }

     ///
     /// Set the port number to use for FTP.
     ///
     /// Port number
     public void setRemotePort(int remotePort)
     {
       this.remotePort = remotePort;
     }

     ///
     /// Return the current port number.
     ///
     /// Current port number
     public int getRemotePort()
     {
       return remotePort;
     }

     ///
     /// Set the remote directory path.
     ///
     /// The remote directory path
     public void setRemotePath(string remotePath)
     {
       this.remotePath = remotePath;
     }

     ///
     /// Return the current remote directory path.
     ///
     /// The current remote directory path.
     public string getRemotePath()
     {
       return remotePath;
     }

     ///
     /// Set the user name to use for logging into the remote 
server.
     ///
     /// Username
     public void setRemoteUser(string remoteUser)
     {
       this.remoteUser = remoteUser;
     }

     ///
     /// Set the password to user for logging into the remote 
server.
     ///
     /// Password
     public void setRemotePass(string remotePass)
     {
       this.remotePass = remotePass;
     }

     ///
     /// Return a string array containing the remote directory's 
file list.
     ///
     ///
     ///
     public string[] getFileList(string mask)
     {

       if(!logined)
       {
         login();
       }

       Socket cSocket = createDataSocket();

       sendCommand("NLST " + mask);

       if(!(retValue == 150 || retValue == 125))
       {
         throw new IOException(reply.Substring(4));
       }

       mes = "";

       while(true)
       {

         int bytes = cSocket.Receive(buffer, buffer.Length, 0);
         mes += ASCII.GetString(buffer, 0, bytes);

         if(bytes < buffer.Length)
         {
           break;
         }
       }

       char[] seperator = {'\n'};
       string[] mess = mes.Split(seperator);

       cSocket.Close();

       readReply();

       if(retValue != 226)
       {
         throw new IOException(reply.Substring(4));
       }
       return mess;

     }

     ///
     /// Return the size of a file.
     ///
     ///
     ///
     public long getFileSize(string fileName)
     {

       if(!logined)
       {
         login();
       }

       sendCommand("SIZE " + fileName);
       long size=0;

       if(retValue == 213)
       {
         size = Int64.Parse(reply.Substring(4));
       }
       else
       {
         throw new IOException(reply.Substring(4));
       }

       return size;

     }

     ///
     /// Login to the remote server.
     ///
     public void login()
     {

       clientSocket = new 
Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
       IPEndPoint ep = new 
IPEndPoint(Dns.Resolve(remoteHost).AddressList[0], remotePort);

       try
       {
         clientSocket.Connect(ep);
       }
       catch(Exception)
       {
         throw new IOException("Couldn't connect to remote 
server");
       }

       readReply();
       if(retValue != 220)
       {
         close();
         throw new IOException(reply.Substring(4));
       }
       if(debug)
         Console.WriteLine("USER "+remoteUser);

       sendCommand("USER "+remoteUser);

       if( !(retValue == 331 || retValue == 230) )
       {
         cleanup();
         throw new IOException(reply.Substring(4));
       }

       if( retValue != 230 )
       {
         if(debug)
           Console.WriteLine("PASS xxx");

         sendCommand("PASS "+remotePass);
         if( !(retValue == 230 || retValue == 202) )
         {
           cleanup();
           throw new IOException(reply.Substring(4));
         }
       }

       logined = true;
       Console.WriteLine("Connected to "+remoteHost);

       chdir(remotePath);

     }

     ///
     /// If the value of mode is true, set binary mode for 
downloads.
     /// Else, set Ascii mode.
     ///
     ///
     public void setBinaryMode(Boolean mode)
     {

       if(mode)
       {
         sendCommand("TYPE I");
       }
       else
       {
         sendCommand("TYPE A");
       }
       if (retValue != 200)
       {
         throw new IOException(reply.Substring(4));
       }
     }

     ///
     /// Download a file to the Assembly's local directory,
     /// keeping the same file name.
     ///
     ///
     public void download(string remFileName)
     {
       download(remFileName,"",false);
     }

     ///
     /// Download a remote file to the Assembly's local 
directory,
     /// keeping the same file name, and set the resume flag.
     ///
     ///
     ///
     public void download(string remFileName,Boolean resume)
     {
       download(remFileName,"",resume);
     }

     ///
     /// Download a remote file to a local file name which can 
include
     /// a path. The local file name will be created or 
overwritten,
     /// but the path must exist.
     ///
     ///
     ///
     public void download(string remFileName,string locFileName)
     {
       download(remFileName,locFileName,false);
     }

     ///
     /// Download a remote file to a local file name which can 
include
     /// a path, and set the resume flag. The local file name will 
be
     /// created or overwritten, but the path must exist.
     ///
     ///
     ///
     ///
     public void download(string remFileName,string 
locFileName,Boolean resume)
     {
       if(!logined)
       {
         login();
       }

       setBinaryMode(true);

       Console.WriteLine("Downloading file "+remFileName+" from 
"+remoteHost + "/"+remotePath);

       if (locFileName.Equals(""))
       {
         locFileName = remFileName;
       }

       if(!File.Exists(locFileName))
       {
         Stream st = File.Create(locFileName);
         st.Close();
       }

       FileStream output = new 
FileStream(locFileName,FileMode.Open);

       Socket cSocket = createDataSocket();

       long offset = 0;

       if(resume)
       {

         offset = output.Length;

         if(offset > 0 )
         {
           sendCommand("REST "+offset);
           if(retValue != 350)
           {
             //throw new IOException(reply.Substring(4));
             //Some servers may not support resuming.
             offset = 0;
           }
         }

         if(offset > 0)
         {
           if(debug)
           {
             Console.WriteLine("seeking to " + offset);
           }
           long npos = output.Seek(offset,SeekOrigin.Begin);
           Console.WriteLine("new pos="+npos);
         }
       }

       sendCommand("RETR " + remFileName);

       if(!(retValue == 150 || retValue == 125))
       {
         throw new IOException(reply.Substring(4));
       }

       while(true)
       {

         bytes = cSocket.Receive(buffer, buffer.Length, 0);
         output.Write(buffer,0,bytes);

         if(bytes <= 0)
         {
           break;
         }
       }

       output.Close();
       if (cSocket.Connected)
       {
           cSocket.Close();
       }

       Console.WriteLine("");

       readReply();

       if( !(retValue == 226 || retValue == 250) )
       {
         throw new IOException(reply.Substring(4));
       }

     }

     ///
     /// Upload a file.
     ///
     ///
     public void upload(string fileName)
     {
       upload(fileName,false);
     }

     ///
     /// Upload a file and set the resume flag.
     ///
     ///
     ///
     public void upload(string fileName,Boolean resume)
     {

       if(!logined)
       {
         login();
       }

       Socket cSocket = createDataSocket();
       long offset=0;

       if(resume)
       {

         try
         {

           setBinaryMode(true);
           offset = getFileSize(fileName);

         }
         catch(Exception)
         {
           offset = 0;
         }
       }

       if(offset > 0 )
       {
         sendCommand("REST " + offset);
         if(retValue != 350)
         {
           //throw new IOException(reply.Substring(4));
           //Remote server may not support resuming.
           offset = 0;
         }
       }

       sendCommand("STOR "+Path.GetFileName(fileName));

       if( !(retValue == 125 || retValue == 150) )
       {
         throw new IOException(reply.Substring(4));
       }

       // open input stream to read source file
       FileStream input = new 
FileStream(fileName,FileMode.Open);

       if(offset != 0)
       {

         if(debug)
         {
           Console.WriteLine("seeking to " + offset);
         }
         input.Seek(offset,SeekOrigin.Begin);
       }

       Console.WriteLine("Uploading file "+fileName+" to 
"+remotePath);

       while ((bytes = input.Read(buffer,0,buffer.Length)) > 0)
       {

         cSocket.Send(buffer, bytes, 0);

       }
       input.Close();

       Console.WriteLine("");

       if (cSocket.Connected)
       {
           cSocket.Close();
       }

       readReply();
       if( !(retValue == 226 || retValue == 250) )
       {
         throw new IOException(reply.Substring(4));
       }
     }

     ///
     /// Delete a file from the remote FTP server.
     ///
     ///
     public void deleteRemoteFile(string fileName)
     {

       if(!logined)
       {
         login();
       }

       sendCommand("DELE "+fileName);

       if(retValue != 250)
       {
         throw new IOException(reply.Substring(4));
       }

     }

     ///
     /// Rename a file on the remote FTP server.
     ///
     ///
     ///
     public void renameRemoteFile(string oldFileName,string 
newFileName)
     {

       if(!logined)
       {
         login();
       }

       sendCommand("RNFR "+oldFileName);

       if(retValue != 350)
       {
         throw new IOException(reply.Substring(4));
       }

       //  known problem
       //  rnto will not take care of existing file.
       //  i.e. It will overwrite if newFileName exist
       sendCommand("RNTO "+newFileName);
       if(retValue != 250)
       {
         throw new IOException(reply.Substring(4));
       }

     }

     ///
     /// Create a directory on the remote FTP server.
     ///
     ///
     public void mkdir(string dirName)
     {

       if(!logined)
       {
         login();
       }

       sendCommand("MKD "+dirName);

       if(retValue != 250)
       {
         throw new IOException(reply.Substring(4));
       }

     }

     ///
     /// Delete a directory on the remote FTP server.
     ///
     ///
     public void rmdir(string dirName)
     {

       if(!logined)
       {
         login();
       }

       sendCommand("RMD "+dirName);

       if(retValue != 250)
       {
         throw new IOException(reply.Substring(4));
       }

     }

     ///
     /// Change the current working directory on the remote FTP 
server.
     ///
     ///
     public void chdir(string dirName)
     {

       if(dirName.Equals("."))
       {
         return;
       }

       if(!logined)
       {
         login();
       }

       sendCommand("CWD "+dirName);

       if(retValue != 250)
       {
         throw new IOException(reply.Substring(4));
       }

       this.remotePath = dirName;

       Console.WriteLine("Current directory is "+remotePath);

     }

     ///
     /// Close the FTP connection.
     ///
     public void close()
     {

       if( clientSocket != null )
       {
         sendCommand("QUIT");
       }

       cleanup();
       Console.WriteLine("Closing...");
     }

     ///
     /// Set debug mode.
     ///
     ///
     public void setDebug(Boolean debug)
     {
       this.debug = debug;
     }

     private void readReply()
     {
       mes = "";
       reply = readLine();
       retValue = Int32.Parse(reply.Substring(0,3));
     }

     private void cleanup()
     {
       if(clientSocket!=null)
       {
         clientSocket.Close();
         clientSocket = null;
       }
       logined = false;
     }

     private string readLine()
     {

       while(true)
       {
         bytes = clientSocket.Receive(buffer, buffer.Length, 0);
         mes += ASCII.GetString(buffer, 0, bytes);
         if(bytes < buffer.Length)
         {
           break;
         }
       }

       char[] seperator = {'\n'};
       string[] mess = mes.Split(seperator);

       if(mes.Length > 2)
       {
         mes = mess[mess.Length-2];
       }
       else
       {
         mes = mess[0];
       }

       if(!mes.Substring(3,1).Equals(" "))
       {
         return readLine();
       }

       if(debug)
       {
         for(int k=0;k < mess.Length-1;k++)
         {
           Console.WriteLine(mess[k]);
         }
       }
       return mes;
     }

     private void sendCommand(String command)
     {

       Byte[] cmdBytes = 
Encoding.ASCII.GetBytes((command+"\r\n").ToCharArray());
       clientSocket.Send(cmdBytes, cmdBytes.Length, 0);
       readReply();
     }

     private Socket createDataSocket()
     {

       sendCommand("PASV");

       if(retValue != 227)
       {
         throw new IOException(reply.Substring(4));
       }

       int index1 = reply.IndexOf('(');
       int index2 = reply.IndexOf(')');
       string ipData = 
reply.Substring(index1+1,index2-index1-1);
       int[] parts = new int[6];

       int len = ipData.Length;
       int partCount = 0;
       string buf="";

       for (int i = 0; i < len && partCount <= 6; i++)
       {

         char ch = Char.Parse(ipData.Substring(i,1));
         if (Char.IsDigit(ch))
           buf+=ch;
         else if (ch != ',')
         {
           throw new IOException("Malformed PASV reply: " + 
reply);
         }

         if (ch == ',' || i+1 == len)
         {

           try
           {
             parts[partCount++] = Int32.Parse(buf);
             buf="";
           }
           catch (Exception)
           {
             throw new IOException("Malformed PASV reply: " + 
reply);
           }
         }
       }

       string ipAddress = parts[0] + "."+ parts[1]+ "." +
         parts[2] + "." + parts[3];

       int port = (parts[4] << 8) + parts[5];

       Socket s = new 
Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
       IPEndPoint ep = new 
IPEndPoint(Dns.Resolve(ipAddress).AddressList[0], port);

       try
       {
         s.Connect(ep);
       }
       catch(Exception)
       {
         throw new IOException("Can't connect to remote 
server");
       }

       return s;
     }

   }
}

das Ganze hab ich hier http://www.csharphelp.com/archives/archive9.html gefunden.

Vielen Dank für Eure Hilfe.

T
433 Beiträge seit 2006
vor 14 Jahren

Hallo im Forum!

Zu aller erst solltest du deine Postings etwas übersichtlicher gestalten.
Keiner wird hier den Seitenlangen Quellcode durchackern. Du solltest auch nur ausgewählte Teile davon posten wenn es darin zu Problemen kommt.

Dann hast du überhaupt keine Frage gestellt?
Der Error code 500 ist doch auch recht eindeutig bei FTP. Entweder existiert die Datei nicht oder du hast keine Berechtigung drauf, dass ist kein Softwareproblem.

Gruß,
Tom

D
dr.hardware Themenstarter:in
7 Beiträge seit 2009
vor 14 Jahren
Danke für die Belehrung

Klar ist hier gar nichts, weil ich alle möglichen FTP-Operationen ausführen kann ( FTP-Verzeichnis durchsuchen, Dateien Downloaden) nur ich kann keine Datei hochladen. Ausserdem geht es um Fehler 550 nicht 500. Was ist an meinem Posting unübersichtlich? Es ist einfach nur alles da, was man braucht um die Sache zu verstehen. Welche Frage soll ich eigentlich stellen, mein Problem steht doch unter dem ersten Quelltext.

VG Jens

T
433 Beiträge seit 2006
vor 14 Jahren

Ich habe anstatt 550 500 geschrieben. Die von mir genannte Fehlermeldung bezieht sich dennoch auf den Error Code 550 (siehe Google).

Und ich kann immer noch nicht verstehen was du willst.
Der Server sagt dir du hast keine Berechtigung drauf, dass musst du ändern. Und zwar am FTP Server und nicht an deinem Code.

Btw es gibt auch schon fertige FTP Client Klassen im .NET Framework. Siehe FTPWebRequest.

Gruß,
Tom

4.506 Beiträge seit 2004
vor 14 Jahren

Hallo Tom,

Btw es gibt auch schon fertige FTP Client Klassen im .NET Framework. Siehe FTPWebRequest.

Die Framework FTP Klassen sind aber nur eingeschränkt verwendbar. Versuche mal mit einer offenen FTP Verbindung ein Verzeichnis zu wechseln...

Daher ist die Verwendung einer FTP Library zumindest für mich sehr verständlich.

Hallo dr.hardware,

ich vermute genau wie Tom auch, dass Du keine Schreibrechte auf dem FTP Server hast. Gibt es vielleicht dort ein Verzeichnis "public" oder "upload"? Meist hat man nur auf diesen Verzeichnissen Schreibrechte.

Oder aber Du vebindest Dich anonym mit dem FTP Server und hast dann per se nur Leserechte. Dann versuche Dich mal mit Benutzername und Kennwort zu authentifiezieren, funktioniert es dann?

Ein Fehler 550 ist in der Tat kein Fehler in der Anwendung, sondern eine gültige Fehlermeldung von Seiten des Servers.

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

D
dr.hardware Themenstarter:in
7 Beiträge seit 2009
vor 14 Jahren
Schreibrechte

Das hab ich auch schon vermutet, aber ich kann mit anderen FTP Programmen in jedem Ordner schreiben auch oberhalb von dem Webroot "html".

T
433 Beiträge seit 2006
vor 14 Jahren

Aha, sowas sind doch mal wichtige Informationen.

Also mit anderen FTP Clients kannst du genau die Datei in das Verzeichnis hochladen, welches in deiner FTP Library nicht geht?

Wenn du schon eine 3rd party library nutzen willst, würde ich einfach eine andere nehmen.

Oder halt per FtpWebRequest: How to: Upload Files with FTP

Gruß,
Tom

D
dr.hardware Themenstarter:in
7 Beiträge seit 2009
vor 14 Jahren
verdammt...

Hallo, also das Script hat wohl von Anfang an alles richtig gemacht. Nur mein ISA-Server hat sich gewehrt 😃. Das halb eine neue Frage, hat jemand ne Idee wie man hier noch die Anmeldedaten für einen Proxy einbauen kann?

VG Jens

T
433 Beiträge seit 2006
vor 14 Jahren

Ich würde mir eine andere FTP lib suchen.

Ansonsten wünsche ich viel Spass: FTP through a proxy

Gruß,
Tom

4.506 Beiträge seit 2004
vor 14 Jahren

Hallo zusammen,

eine der besten und vollständigsten C# Freeware FTP Komponente die ich bisher gesehen habe:
BytesRoad.NetSuit Library 2.0

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

D
dr.hardware Themenstarter:in
7 Beiträge seit 2009
vor 14 Jahren
Dateien aus Verzeichnis auflisten

Hallo,

Vielleicht gibt es ja jemanden, der sich den folgenden Link mal anschauen kann und das Ganze mal Compiliert
http://www.csharphelp.com/archives/archive9.html

Ganz am Ende von dem Code gibt es einen Teil "Test.cs" dort sollen Dateien aufgelistet werden und dann eine Datei hochgeladen werden.
Der Upload geht bei mir, nur werden selbst wenn ich 200 Dateien in dem Verzeichnis hab immer nur eine angezeigt. Hat jemand ne Idee oder eine Lösöng, damit ale Dateien angezeigt werden?

Vielen Dank für Eure Mühe

T
253 Beiträge seit 2006
vor 14 Jahren

Hallo Dr. Hardware,

ich nutze die gleiche Komponente - sie ist auch gleich mit der von dir geposteten.
Ich habe lediglich die also obsolet gekennzeichneten Typen ersetzt und kann sowohl uploads als auch downloads durchführen.