FTP-Download



  • Guten Morgen allerseits,

    ich stehe gerade vor einem kleinen Problem.
    Und zwar schreibe ich meine Memberfunktionen für FTP-Aktionen um.
    Dabei will ich .NET benutzen.
    Zwar habe ich den "Download" hinbekommen, aber nicht so wie erhofft.
    Da, wenn ich z.B. ein Bild runterlade es falsch abgespeichert wird...
    also irgendeine andere Kodierung hat.
    Und mit der anderen Weise kann ich zwar auch bilder runterladen,
    jedoch muss ich mit einem Array als puffer arbeiten.

    int cl_connect::ftp_open(string server, int port, string user, string pass)
    {
    this->ftp_handler = dynamic_cast<FtpWebRequest^>(WebRequest::Create(cl_convert::ToString(server+"/entwurf.jpg")));
    	this->ftp_handler->Method = WebRequestMethods::Ftp::DownloadFile;
    	this->ftp_handler->Credentials = gcnew NetworkCredential(cl_convert::ToString(user),cl_convert::ToString(pass));
    
    	FtpWebResponse^ response = dynamic_cast<FtpWebResponse^>(this->ftp_handler->GetResponse());
    	Console::WriteLine(response->StatusDescription);
    
    	Stream^ responseStream = response->GetResponseStream();
    	Console::WriteLine(response->StatusDescription);
    	StreamReader^ reader = gcnew StreamReader(responseStream);
    
    	int bufferSize = 2048000;
            int readCount;
    	array <Byte,1>^ buffer=gcnew array<Byte,1>(bufferSize);
    
    	readCount = responseStream->Read(buffer, 0, bufferSize);
            while (readCount > 0)
            {
                file->Write(buffer, 0, readCount);
    			readCount = responseStream->Read(buffer, 0, bufferSize);
    
            }
    
    	responseStream->Close();
    	file->Close();
    	response->Close();
    return 0;
    }
    

    Vielleicht wisst ihr ja eine gute Möglichkeit (mit dieser NET-Komponente)?
    Freue mich auf Antwort.

    Chris



  • Nur so ne frage aber woher holst du dir

    file?



  • k das hatte ich vergessen beim rauswuseln aus dem quelltext^^
    FileStream^ file;



  • Ist wahrscheinlich Base64 codiert, musste umcodieren, gibt Klassen in .net dafür.



  • Wieso base64-kodiert? Das ist bei mir bisher nie der Fall gewesen?



  • Hi!

    Du hast von Codierung gesprochen, so lag das nahe. Habe mir Deinen Code diesmal angesehen, setze mal das FtpWebRequest.UseBinary Property auf true.

    Sebo



  • also in dieser version klappt es ja...nur halt möchte ich keine Vordefinierte Buffergröße haben...
    Es muss doch eine vollkommen für alle alle Dateiformate passende Lösung geben für diese NET-Komponente.

    @SeboStone:
    Habe mir doch den Status von response ausgeben lassen,
    der Betritt dann den BinaryMode von allein^^

    Also das Grundgerüst dafür sieht so aus

    //this->ftp_handler ist definiert in der klasse vom typ FtpWebRequest
    
    	this->ftp_handler = dynamic_cast<FtpWebRequest^>(WebRequest::Create(cl_convert::ToString(server+"/entwurf.jpg")));
    	this->ftp_handler->Method = WebRequestMethods::Ftp::DownloadFile;
    	this->ftp_handler->Credentials = gcnew NetworkCredential(cl_convert::ToString(user),cl_convert::ToString(pass));
    	this->ftp_handler->UseBinary = true;
    	FtpWebResponse^ response = dynamic_cast<FtpWebResponse^>(this->ftp_handler->GetResponse());
    	Console::WriteLine(response->StatusDescription);
    
    	Stream^ responseStream = response->GetResponseStream();
    
    	StreamReader^ reader = gcnew StreamReader(responseStream);
    
    //////////////////////////////////////////
    //HIER SOLL DIE DATEI ABGESPEICHERT WERDEN
    
    ///////////////////////////////////////////	
    	reader->Close();
    	responseStream->Close();
    	response->Close();
    

    Die Grundidee kam ja von msdn, jedoch ist das ne mogelpackung was die dort zeigen...
    als titel war zwar How to: Download Files with FTP,
    jedoch wird die datei nicht abgespeichert sondern einfach Console.WriteLine(reader.ReadToEnd()); benutzt...
    Auch verbesserungsvorschläge sind willkommen 🙂



  • Eigentlich müsste auch gehen:

    WebClient wc=new WebClient();
    wc.DownloadFile("ftp://user:pass@server.de/blupp/bla.jpg","c:\\bla.jpg");
    


  • Oje, sag' doch gleich was Du willst! Hättest übrigens selber drauf kommen können bzw. mit etwas Recherche hättest Du das folgendes gefunden: http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/cpref/html/frlrfSystemIOStreamWriterClassTopic.asp



  • Also ich hab gesucht wie verrückt, und nie das gefunden was ich wollte.
    Und den Streamwriter zu benutzen hab ich auch versucht...Bild wird z.B. nicht richtig gespeichert.

    Das einzige was richtig funktioniert, war das erste Codebeispiel, was ich gepostet hab....
    Jedoch missfällt mir die Sache mit der Vordefinierten Puffergröße.
    Oder gibts evtl noch bessere Möglichkeiten?
    Da ich die FTP-Verbindung in einzelnen Funktionen jeweils Öffnen und schließen will,
    und andere Funktion (für aktionen) darauf aufbauen will...


Anmelden zum Antworten