[C#] FTP Upload - Mehrer Uploads gleichzeitig
lima-city → Forum → Programmiersprachen → Programmieren mit .NET & Mono
ablegen
browser
code
datei
erfolg
fehler
festlegen
ftp
http
liste
nutz
objekt
port
problem
punkt
sekunde
senden
server
url
zugriff
-
Hi.
Ich benötige ein kleiens Programm, mit welchem ich mehrere Dateien parallel auf einen FTP-Server schaufeln kann.
Dabei ist für den Upload folgendes wichtig:
1. Es müssen mehrere Dateien parallel hochgeladen werden
2. Für jeden Upload muss ich eine maximale Uploadgeschwindigkeit einstellen können
3. Die zur Verfügung stehende Bandbreite zum Hochladen ist natürlich variabel, bzw unbekannt. Bei 10 parallelen Uploads soll es nicht vorkommen, dass 5 mit ihrer maximal zugelassenen Geschwindigkeit hochladen und die anderen 5 praktsich die Arschkarte haben.
Die Punkte sind eine Voraussetzung. Ich habe keine Lust hier groß zu erklären warum es so ist, daher nehmt bitte einfach hin, dass es so sein soll
Nun hat das .net-Framework ja schon Klassen für einen FTP-Upload dabei. Diese scheinen jedoch sehr simpel gehalten zu sein. Das sehe ich jetzt nicht als Problem an. Trotzdem die Frage: Sollte ich die benutzen oder empfehlt ihr eher was komplexeres?
Angenommen ich nehme das was mir das .net-Framework bietet:
Für jede Datei dich ich hochladen will benötige ich ja ein neues FtpWebRequest. Für einen parallelen Upload benötige ich also mehrere gleichzeitig. Um Punkt 3 abzuhacken wäre würde ich sagen, dass man jeden Upload in einem eigenen Thread laufen lässt. Was sagt ihr dazu?
Soweit ich das weiß kann man die maximale Uploadgeschwindigkeit nicht einfach irgendwo festlegen. Meine Lösung dazu wäre, sich am Anfang der Sekunde die Systemzeit zu merken. Nachdem die maximal zulässige Datenmenge in der Sekunde dann hochgeladen ist, wird für den Thread ein sleep für den Rest der sekunde aufgerufen.
Ist das so machbar?
Ich habe zwar schon in VB, C/C++ und Java programmiert, in C# ist das jetzt aber mein erstes Programm. Zudem habe ich bisher noch nicht mit Threads und FTP-Upload gearbeitet. Wenn ich also irgendwo totalen bullshit geschrieben habe, nehmt es mir nicht zu übel
Danke schonmal für eure Anmerkungen!
MfG
Faultier -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo,
für diese vielen Ansprüche fällt mir grad keiner um. Schau dich doch mal auf verschiedenen Downloadportalen um! Oder google das, FTP-Clients gibt es unter anderem auch hier:
http://www.pcwelt.de/Downloads-Internet-Browser-Mail-Browser-Netz-513819.html
http://www.chip.de/Downloads_13649224.html?tid1=38924&tid2=0
Vielleicht hilft dir das weiter. -
Wir sind hier im Programmierforum und nicht im "Suche fertige Software"
Das es fertige FTP-Clients gibt ist mir schon klar. Um den Upload-Client wird noch ne Menge andere Funktionalität zur automatisierung von bestimmten Aufgaben programmiert. Mit einem fertigen Client kann ich daher nichts anfangen.
Was mir wichtig wäre ist, dass mir kurz jemand ne bestätigung gibt, dass das so wie ich das geplant habe in etwa "richtig" und halbwegs sauber ist oder dass mir jemand sagt, dass das der völlig falsche Ansatz ist und ich mir erstmal xyz angucken sollte -
Hallo faultier89,
grundsätzlich denke ich, dass Deine Idee funktionieren wird.
Das Du für jeden Upload ein FtpWebRequest-Objekt benötigst ist richtig.
Allerdings könnte man es evtl. auch ohne Threads machen (bei langsamen Uploads) bzw. mit einem Thread, wenn der Hauptthread durch das Senden zu lange blockiert würde.
Ich würde es wohl mit einem Timer versuchen.
Ich denke, das man den BinaryReader der Quelldatei, das FtpWebRequest-Objekt und den RequestStream zusammen in einer Liste ablegen könnte.
Dann kann man bei jedem Timer-Signal anhand der Listengröße festlegen, wieviele Bytes pro Verbindung gesendet werden sollen, diese senden und dann wieder auf den nächsten Tick warten.
Ich wünsche noch viel Erfolg. -
Ich komme hier an einer Stelle nicht weiter:
UriBuilder ub = new UriBuilder(); ub.Port = 21; ub.Scheme = "ftp"; ub.Host = "ftp.lima-city.de"; ub.Path = Path.GetFileName(path); ub.Password = "*********"; ub.UserName = "faultier89"; Uri uripath = ub.Uri; FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(uripath); request.Credentials = new NetworkCredential(user, pass); request.Proxy = null; request.UsePassive = true; request.UseBinary = true; request.KeepAlive = false; request.Method = WebRequestMethods.Ftp.UploadFile; FileStream stream = File.OpenRead(path); Stream reqStream = request.GetRequestStream(); <-- hier knallts ...
Der Fehler:
Der Remoteserver hat einen Fehler zurückgegeben: (550) Datei nicht verfügbar (z.B. nicht gefunden oder kein Zugriff).
Ich habe das ganze auch schon mit nicht ganz so vollständiger uri und verschiedenen request-Einstellungen versucht. Bisher ohne erfolg.
Wenn ich den Code allerdings für einen Funpic FTP nutze funktioniert das ganze einwandfrei. Das ganze scheint also in irgend einer Weise mit dem Server von Lima zusammen zu hängen. Weiß rein zufällig einer was ich bei mir ändern muss um den Code zu Lima kompatibel zu machen?
MfG
Faultier
-edit-
Hat sich erledigt. Mit dem eigentlichen Zielserver funktioniert das jetzt.
Allerdings habe ich noch das Problem, dass ich nicht mehr als 2 Uploads gleichzeitig tätigen kann. Die weiteren 2 Uploads die eigentlich direkt parallel mitlaufen sollten, fangen erst an wenn die ersten beiden fertig sind. Die hängen bei der getRequestStream()-Funktion. Mit FileZilla kann ich jedoch auf den selben Server beliebig viele Uploads parallel tätigen.
Irgendwer nen Vorschlag?
-edit-
Hat sich auch erledigt. Per default ist man auf 2 connections pro IP beschränkt. Lässt sich aber ganz einfach in der app.config ändern :-)
Beitrag zuletzt geändert: 27.3.2011 3:23:20 von faultier89 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage