FTP RESUME

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Alex66955
User
Beiträge: 9
Registriert: Donnerstag 1. Juli 2010, 12:11

Hallo libe Community,

Bin dabei mir ein Skript zu schreiben welches eine Liste von Dateien auf einen FTP-Server hochlädt. Dabei handelt es sich um relativ große dateien und die warscheinlichkeit das die vorhandene Internetverbindung in meinem System abbricht ist auch zimlich hoch.

Deswegen muss eine Fortsetzmöglichkeit her die es ermöglicht auch nach einem Verbindungsabruch wieder fortzufahren.

mein bisheriger Code funktioniert soweit:

Code: Alles auswählen

def connect_ftp():
    """
    Verbinden mit dem FTP-Server
    @return: Gibt eine Referenz der FTP-Verbindung zurueck
    """
    ftp = ftplib.FTP()
    try:
        ftp.connect(upload_configuration.TARGET_HOST)
        ftp.login(upload_configuration.FTP_USER, upload_configuration.FTP_PWD)
        print "Verbinden mit Ftp-Server ok\n"

        return ftp
    
    except Exception, exc:
        print "Verbinden mit Ftp-Server fehlgeschlagen: Fehlermeldung" + str(exc) + "\n"
        send_mail(FAILD_FTP_SUBJECT, FAILD_FTP_CONTAIN + str(exc))
        sys.exit(1)

Code: Alles auswählen

def upload_files():
    """Dateien auf den FTP-Server hochladen"""
    is_upload_true = True
    file_status = {"FAILD": "Fehlgeschlagen", "OK": "OK"} #~~~
    directory   = "/umts/transfer"

    #Liste der Dateien fuer den upload auf den FTP-Server
    file_list = {
        "datei_eins": file_status["FAILD"],
        "datei_zwei": file_status["FAILD"],
        }

    file_directory = "/home/temp/"                                #LOESCHEN NUR ZUM LOKALEN TESTEN
    Configuration.FRAME_LOGGER_OUTPUT_PATH = file_directory       #LOESCHEN NUR ZUM LOKALEN TESTEN


    ftp = connect_ftp()
    
    #Liste der Dateien durchgehen und jede Datei uploaden
    #Bei Fehler Status der Datei aendern
    for filename in file_list:
        try:
            f = open(Configuration.FRAME_LOGGER_OUTPUT_PATH + filename, "r")

            ftp.cwd(directory)
            ftp.storbinary("STOR " + filename, f)
            f.close()

            file_list[filename] = file_status["OK"]
            print filename + " upload ok\n"


        except Exception, exc:
            is_upload_true = False
            print filename + " upload fehlgeschlagen: Fehlermeldung:" + str(exc) + "\n"
            
    ftp.quit()


    #Email senden bei Erfolg/Misserfolg
    if is_upload_true == True:
        extension_text = create_email_body(file_list)
        send_mail(SUCCESS_SUBJECT, SUCCESS_CONTAIN + extension_text)
    else:
        extension_text = create_email_body(file_list)
        send_mail(FAILD_SUBJECT, FAILD_CONTAIN + extension_text)

Gruß
Alex
Zuletzt geändert von Anonymous am Donnerstag 1. Juli 2010, 12:30, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Sowas müsste m.E. mit dem FTP-Kommando "REST" gehen. Entweder nutzt du also den Befehl ntransfercmd() oder du setzt REST manuell ab. Wenn du das machst, muss das direkt vor dem nächsten Transfer erfolgen.

Habe es jetzt nicht ausprobiert, aber wenn der Server es unterstützt, sollte das schon helfen.

Besten Gruß,

brb
Alex66955
User
Beiträge: 9
Registriert: Donnerstag 1. Juli 2010, 12:11

Danke hat mich weiter gebracht.

Die Lösung:
Also wenn ein Resum durchgeführt werden soll:

Code: Alles auswählen

filename = "/home/temp.rar"
f = open(filename, "r")


#get file size from server
size= ftp.sendcmd("SIZE " + filename).split(" ",1)


#entfernen der nicht benötigten antwort des servers
if len(size) == 2:
    size = size[1]

#file ab Position Lesen
f.seek(int(size)), 0)

ftp.sendcmd("PASV")
ftp.sendcmd("REST " + size)
ftp.storebinary("STOR " + filename, f)

Antworten