FTPUpload per InternetWriteFile

  • Hallo..
    ich muss nochmal euer Fachwissen in Anspruch nehmen ;)
    Wie mir zu meiner Frage zum Auslesen des Fortschritts eines FTP-Uploads geraten wurde
    habe ich nun versucht, mir eine Funktion mit FTPOpenFile & InternetWriteFile aus der Wininet.dll
    zu schreiben.

    Spoiler anzeigen
    [autoit]

    $x = _FTP_Upload( $serv, $username, $pass, 'testdatei.txt' )
    MsgBox( 0, '', $x & '-' & @error )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _FTP_Upload( $server, $user, $password, $file )
    #Region connect
    Local $ai_InternetOpen = DllCall('wininet.dll', 'long', 'InternetOpen', 'str', 'PicTransfer', 'long', 1, 'str', '', 'str', '', 'long', 0)
    If @error Or $ai_InternetOpen[0] = 0 Then
    SetError(-1)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $i_ServerPort = 0, $l_Service = 1, $l_Context = 0, $l_InternetSession = $ai_InternetOpen[0]
    Local $ai_InternetConnect = DllCall('wininet.dll', 'long', 'InternetConnect', 'long', $l_InternetSession, 'str', $server, 'int', $i_ServerPort, 'str', $user, 'str', $password, 'long', $l_Service, 'long', 0x08000000, 'long', $l_Context)
    If @error Or $ai_InternetConnect[0] = 0 Then
    SetError(-2)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $ai_ftpopenfile = DllCall( 'wininet.dll', 'long', 'FtpOpenFile', 'long', $ai_InternetConnect[0], 'str', $file, 'dword', '0x40000000', 'dword', 0x02, 'dword', 0 )
    If @error Or $ai_ftpopenfile[0] = 0 Then
    SetError(-3)
    Return 0
    EndIf
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    #Region DataSend
    $buffer = FileRead( $file )
    $glen = StringLen( $buffer )
    $x = Int( $glen/100 )
    If $x = 0 Then $x = 1
    Dim $out, $i = 0
    Do
    Local $ai_ftpwrite = DllCall( 'wininet.dll', 'int', 'InternetWriteFile', 'long', $ai_ftpopenfile[0], 'str', $buffer, 'int', $x, 'dword*', $out )
    If @error Or $ai_ftpwrite[0] = 0 Then
    SetError(-4)
    Return 0
    EndIf
    $buffer = StringTrimLeft( $buffer, $x )
    $i = $i +1
    ToolTip( Round( 100 - (( StringLen( $buffer ) / $glen ) *100), 0 ) )
    Sleep( 20 )
    Until StringLen( $buffer ) = 0
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    #region disconnect
    Local $ai_InternetCloseHandle = DllCall('wininet.dll', 'int', 'InternetCloseHandle', 'long', $ai_InternetOpen[0])
    If @error Or $ai_InternetCloseHandle[0] = 0 Then
    SetError(-5)
    Return 0
    EndIf
    #EndRegion
    Return 1
    EndFunc

    [/autoit]

    Mit Textdateien funktioniert das soweit auch einwandfrei;
    eigentlich habe ich das ganze jedoch für Bilder gedacht.
    Und da beginnt die Problematik....
    Die Bilder auf dem Server haben exakt die gleiche Dateigröße, werden aber nicht
    angezeigt bzw. es wird gesagt "Bild sowieso konnte nicht angezeigt werden, da es Fehlerenthält".
    Nun stellt sich mir die Frage: woran scheitert das ?
    Ich hab schon so einiges mit Binary etc rumgespielt, aber bisher hat es noch
    nicht funktioniert...
    help me x)

    mfg limette

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

    Einmal editiert, zuletzt von limette (7. Juni 2008 um 13:55)

  • Evtl. so?

    Spoiler anzeigen
    [autoit]


    $server = "server eintragen"
    $username = "username eintragen"
    $password = "passwort eintragen"
    $file = "file eintragen"

    [/autoit] [autoit][/autoit] [autoit]

    $x = _FTP_Upload( $server, $username, $password, $file )
    MsgBox( 0, '', $x & '-' & @error )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _FTP_Upload( $server, $username, $password, $file )
    #Region connect
    Local $ai_InternetOpen = DllCall('wininet.dll', 'long', 'InternetOpen', 'str', 'PicTransfer', 'long', 1, 'str', '', 'str', '', 'long', 0)
    If @error Or $ai_InternetOpen[0] = 0 Then
    SetError(-1)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $i_ServerPort = 0, $l_Service = 1, $l_Context = 0, $l_InternetSession = $ai_InternetOpen[0]
    Local $ai_InternetConnect = DllCall('wininet.dll', 'long', 'InternetConnect', 'long', $l_InternetSession, 'str', $server, 'int', $i_ServerPort, 'str', $username, 'str', $password, 'long', $l_Service, 'long', 0x08000000, 'long', $l_Context)
    If @error Or $ai_InternetConnect[0] = 0 Then
    SetError(-2)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $ai_ftpopenfile = DllCall( 'wininet.dll', 'long', 'FtpOpenFile', 'long', $ai_InternetConnect[0], 'str', $file, 'dword', '0x40000000', 'dword', 0x02, 'dword', 0 )
    If @error Or $ai_ftpopenfile[0] = 0 Then
    SetError(-3)
    Return 0
    EndIf
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    #Region DataSend
    $buffer = FileRead( $file )
    $glen = StringLen( $buffer )
    $x = Int( $glen/100 )
    If $x = 0 Then $x = 1
    Dim $out, $i = 0
    Do
    Local $ai_ftpwrite = DllCall( 'wininet.dll', 'int', 'InternetWriteFile', 'long', $ai_ftpopenfile[0], 'str', $buffer, 'int', $x, 'dword*', $out )
    If @error Or $ai_ftpwrite[0] = 0 Then
    SetError(-4)
    Return 0
    EndIf
    $buffer = StringTrimLeft( $buffer, $x )
    $i = $i +1
    ToolTip( Round( 100 - (( StringLen( $buffer ) / $glen ) *100), 0 ) )
    Sleep( 20 )
    Until StringLen( $buffer ) = 0
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    #region disconnect
    Local $ai_InternetCloseHandle = DllCall('wininet.dll', 'int', 'InternetCloseHandle', 'long', $ai_InternetOpen[0])
    If @error Or $ai_InternetCloseHandle[0] = 0 Then
    SetError(-5)
    Return 0
    EndIf
    #EndRegion
    Return 1
    EndFunc

    [/autoit]

    Aber sicher bin ich mir da nicht. Ist so aus dem Handgelenk heraus.
    So bekommst bei drücken von F5 auf keinen Fall mehr eine Fehlermeldung.
    Du mußt schon gleiche Variablen verwenden !!!!

    Crazy-A

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    Einmal editiert, zuletzt von Crazy-A (6. Juni 2008 um 16:06)

  • Darauf wär ich jz nicht gekommen...
    Ich kriege, wie geschrieben, ja auch keine [!] Fehlermeldung, wenn ich F5 drücke....
    Und ich hab auch schon gesagt, dass das mit Textdateien einwandfrei funktioniert !!

    Ganz oben wird doch bloß die Funktion aufgerufen,
    $serv, $username, $pass
    hatte ich definiert, .. aber ich veröffentliche hier doch nicht meine LoginDaten ^^

    Nochmal deutlich:

    Es funktioniert mit Textdateien etc !
    Wenn ich aber Bilder hochlade werden diese mir im BROWSER nicht angezeigt.!

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Hallo.

    Du sollst ja auch kein Passwort oder Benutzername veröffentlichen. Nimmst einfach Sternchen und man sieht das Du daran gedacht hast.

    Schau Dir mal das Posting an: [ offen ] Automatisierung von bilder upload auf funpic

    Ansonsten gerne auch mal die SuFu und Hilfe verwenden und danach stehen wir gerne wieder zur Verfügung, so wir noch hier sind. Suchbegriffe wie "Bild", Bilder", "Bilder hochladen", usw. können sehr hilfreich sein.

    InternetWriteFile: ist das nicht eigentlich nur für Textdateien? Macht dich da mal bitte bei den Profis schlau. Oder frag mal über die Shoutbox nach. Ich bin mir da nämlich gar nicht so sicher, ob das auch für Bilder ist. Ansonsten ftp.au3

    Gruß, Crazy-A.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hättest du meinen Post ganz gelesen hättest du gemerkt

    - Dass ich daran gedacht habe
    - Dass ich eben doch EURE Hilfe in Anspruch nehmen möchte
    - Dass mir zu InternetWriteFile geraten wurde ! --> ich hatte bereits längere Abhandlungen über diese FTP-Geschichte.
    Mit FtpPutFile brauchst du mir nicht mehr kommen, das ist alt. Mir ging es aber, wie in meinem ersten Post schon
    geschrieben, um den Fortschritt eines Uploads ! Daraufhin wurde mir zu InternetWriteFile etc geraten !

    Ich will doch den Fortschritt, und da es bei unserem Server nicht mit InetGetSize funzt sollte ich es mit
    InternetWriteFile versuchen !

    Wir ( ein Kumpel und ich ) arbeiten seit MONATEN an diesem *%§!# Fortschrittsbalken für den Upload,
    das letzte was du mir vorwerfen kannst ist, ich hätte Sufu, Hilfe und Google ignoriert !

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Tut mir leid, aber zu manchen Antworten fällt mir einfach nichts mehr ein ...

    Entweder man liest einen Post komplett und versucht ihn zu verstehen und dann sinnvoll zu antworten oder sogar gegebenfalls weiterzuhelfen, aber was sollen Verweise auf Google etc. , wenn das die ersten Anlaufstellen sind und man eine Expertenmeinung haben möchte, wenn man diese nicht selber hat. Also entweder kann man helfen oder nicht ...

    Das ist keinesfalls abwertend oder beleidigend gemeint. :!:

  • Hättest du meinen Post ganz gelesen hättest du gemerkt
    ...
    ...
    das letzte was du mir vorwerfen kannst ist, ich hätte Sufu, Hilfe und Google ignoriert !


    limette
    Also, ich bin die letzte Userin, die anderen etwas vorwerft, dazu habe ich auch gar kein Recht.
    Der Hinweis zur SuFu und Hilfe war ein Tip, da dort einiges bezüglich Upload (auch Bildupload) zu finden ist.

    So, für mich ist hiermit dieses Thema beendet.

    Gruß, Crazy-A. X(

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Sorry, es ist bloß so, dass wir schon ewig daran tüfteln,
    und auch schon einige Tipps von euch bekommen haben.

    Alles, was du bis jetzt angeführt hast, war unnötig, wie sich aus meinem ersten Post in diesem
    Topic entnehmen lies.

    Du meintest:

    Zitat

    So bekommst bei drücken von F5 auf keinen Fall mehr eine Fehlermeldung.
    Du mußt schon gleiche Variablen verwenden !!!!


    Naja, bloß hatte ich schon geschrieben:

    Zitat

    Mit Textdateien funktioniert das soweit auch einwandfrei;

    Dann meintest du:

    Zitat


    Schau Dir mal das Posting an: [ offen ] Automatisierung von bilder upload auf funpic

    Ansonsten gerne auch mal die SuFu und Hilfe verwenden und danach stehen wir gerne wieder zur Verfügung, so wir noch hier sind. Suchbegriffe wie "Bild", Bilder", "Bilder hochladen", usw. können sehr hilfreich sein.

    In dem Topic geht es um FTPPutFile, und darum geht es hier nunmal nicht !
    Und bei DEM Kommentar zur Sufu fühl ich mich leicht verarscht -.- ganz bescheuert bin ich nun nicht..
    Außerdem hatte ich gesagt:

    Zitat

    Wie mir zu meiner Frage zum Auslesen des Fortschritts eines FTP-Uploads geraten wurde
    habe ich nun versucht, mir eine Funktion mit FTPOpenFile & InternetWriteFile aus der Wininet.dll
    zu schreiben.

    Das ist also nicht die erste Abhandlung zu diesem Thema, die ich hatte.

    Dann kam von dir ja auch noch:

    Zitat

    Macht dich da mal bitte bei den Profis schlau.

    Nur mal so... warum erstelle ich denn so ein Topic ?

    Zitat

    Hallo..
    ich muss nochmal euer Fachwissen in Anspruch nehmen ;)


    Das war ja nicht alleine an dich gerichtet, sondern an alle, die gewillt sind zumindest die Problemstellung zu lesen
    und einen ernst gemeinten Rat zum Thema zu geben...

    mfg limette

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • hi...

    schau dir doch mal den 'quelltext' der grafik an...vieleicht hilft dir der weiter...


    grez

  • Hmmm.... wenn ich mir die beiden
    "Quelltexte" so ansehe....
    haben die garnichts gemeinsam 8|

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Du musst bei der Übertragung auch auf das reichtige Format achten:
    In dwFlags muss ASCII oder Binary festgelegt werden:

    Spoiler anzeigen
    Code
    Private Const FTP_TRANSFER_TYPE_ASCII As Long = &H1
    Private Const FTP_TRANSFER_TYPE_BINARY As Long = &H2
    Private Const FTP_TRANSFER_TYPE_MASK As Long = (FTP_TRANSFER_TYPE_ASCII Or FTP_TRANSFER_TYPE_BINARY)
    Private Const FTP_TRANSFER_TYPE_UNKNOWN As Long = &H0


    ( http://msdn.microsoft.com/en-us/library/aa384166(VS.85).aspx )

  • Das ist eine ERNSTE, aber CRAZY Idee.
    Das meine ich echt ernst, weiß nur nicht ob es umsetzbar ist.

    Wenn es mit Textdateien geht, frage ich mich ob das geht, was mir gerade durch den Kopf geht.

    1.) Datei lokal aus test.jpg eine test.txt umbenennen

    2.) die test.txt uploaden

    3.) die test.txt auf dem Server umbenennen.

    Man, da muß es doch endlich mal eine Lsg. geben. FTP ist sowieso ein Thema, wo es immer wieder Fragen gibt. Wo sind die Profis, die da mal die Ideale Lsg für Dummis entwickeln.
    Hier zähle ich mich auch zu den Dummis, aber ich bin auch blond. :rofl:

    Crazy-A

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    Einmal editiert, zuletzt von Crazy-A (6. Juni 2008 um 21:59)

  • Das mit Ascii / Binary muss ich nochmal checken, da hatte ich andere Werte für gefunden,
    dachte eigentlich Binary ist default, so wie es bei msdn steht ;)

    Zu Lina ..
    hast recht, crazy idea ^^
    Ich vermute aber mal, dass es nicht an der Dateiendung hapert sondern an der Art
    der Indormation ;)
    Ich probier es trotzdem mal aus =)

    Edit: Nein, funzt beides nicht.... was ich auch nicht so ganz verstehe: bei msdn steht, flags muss 'n "dword" sein,
    und trotzdem steht woanders überall "long"...

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

    Einmal editiert, zuletzt von limette (6. Juni 2008 um 23:15)

  • Du musst auch als bytes übertragen und nicht als str ;)
    Der korrigierte Code:
    - der Lokale Pfad wird extra angegeben
    - die Datei wird immer nur Stückweise eingelesen
    - es werden keine zusätzlichen Nullbytes übertragen
    - Die Übertragung findet im Binary-Mode statt

    Spoiler anzeigen
    [autoit]

    $x = _FTP_Upload( $serv, $username, $pass, 'testdatei.jpg' , "D:\testdatei.jpg")
    MsgBox( 0, '', $x & '-' & @error )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _FTP_Upload( $server, $user, $password, $file,$FileLocal )
    #Region connect
    Local $aiWinInetDLL = DllOpen("wininet.dll"), $ai_InternetCloseHandle
    Local $ai_InternetOpen = DllCall($aiWinInetDLL, 'long', 'InternetOpen', 'str', 'PicTransfer', 'long', 1, 'str', '', 'str', '', 'long', 0)
    If @error Or $ai_InternetOpen[0] = 0 Then
    DllClose($aiWinInetDLL)
    SetError(-1)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $i_ServerPort = 0, $l_Service = 1, $l_Context = 0, $l_InternetSession = $ai_InternetOpen[0]
    Local $ai_InternetConnect = DllCall($aiWinInetDLL , 'long', 'InternetConnect', 'long', $l_InternetSession, 'str', $server, 'int', $i_ServerPort, 'str', $user, 'str', $password, 'long', $l_Service, 'long', 0x08000000, 'long', $l_Context)
    If @error Or $ai_InternetConnect[0] = 0 Then
    $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetOpen[0])
    DllClose($aiWinInetDLL)
    SetError(-2)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $ai_ftpopenfile = DllCall( $aiWinInetDLL , 'long', 'FtpOpenFile', 'long', $ai_InternetConnect[0], 'str', $file, 'dword', 0x40000000, 'dword', 0x02, 'dword', 0 )
    If @error Or $ai_ftpopenfile[0] = 0 Then
    $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetConnect[0])
    $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetOpen[0])
    DllClose($aiWinInetDLL)
    SetError(-3)
    Return 0
    EndIf
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    #Region DataSend
    Local $fhandle = FileOpen($FileLocal,16)
    ;~ $buffer = FileRead( $fhandle )

    [/autoit] [autoit][/autoit] [autoit]

    $glen = FileGetSize($FileLocal)
    $last = Mod($glen,100)
    $x = ($glen-$last)/100
    $buffer = DllStructCreate("byte[" & $x & "]")

    [/autoit] [autoit][/autoit] [autoit]

    Dim $out, $i = 0, $result
    For $i = 1 To 101
    Select
    Case $i = 101 And $last > 0
    $x = $last
    Case $i = 101 And (Not $last)
    ExitLoop
    Case $glen = $last
    $x = $last
    $i = 101
    EndSelect
    DllStructSetData($buffer,1,FileRead($fhandle,$x))

    Local $ai_ftpwrite = DllCall( $aiWinInetDLL , 'int', 'InternetWriteFile', 'long', $ai_ftpopenfile[0], 'ptr', DllStructGetPtr($buffer), 'int', $x, 'dword*', $out )
    $result += $ai_ftpwrite[4]
    If @error Or $ai_ftpwrite[0] = 0 Then
    $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetConnect[0])
    $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetOpen[0])
    FileClose($fhandle)
    DllClose($aiWinInetDLL)
    SetError(-4)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ToolTip( $i )
    Sleep( 20 )

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit] [autoit][/autoit] [autoit]

    FileClose($fhandle)
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    #region disconnect
    $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetConnect[0])
    $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetOpen[0])
    If @error Or $ai_InternetCloseHandle[0] = 0 Then
    DllClose($aiWinInetDLL)
    SetError(-5)
    Return 0
    EndIf
    #EndRegion
    DllClose($aiWinInetDLL)
    Return 1
    EndFunc

    [/autoit]
  • Wow, danke, funktioniert super ! :D

    Wenn ich den Code jetzt noch verstehen würde wär das genial ^^

    [autoit]


    $glen = FileGetSize($FileLocal) ; Gesamtlänge
    $last = Mod($glen,100) ; der Rest der überbleibt, wenn ich das in 100 Pakete teile ?
    $x = ($glen-$last)/100 ; $x = ( Gesamtlänge - Rest ) / 100 , also die Länge der 100 Pakete , den Rest außen vor gelassen ?
    $buffer = DllStructCreate("byte[" & $x & "]") ; erstellt die Struct mit 'byte[länge]' ? Warum ? ^^

    [/autoit]


    Warum muss man da "byte[" & $x & "]" in die Struct ?
    Das

    [autoit]

    DllStructSetData($buffer,1,FileRead($fhandle,$x))

    [/autoit]


    und der Select davor ist mir verständlich...

    Mein Fehler im Dll-Call des InternetWriteFile war wohl, dass er einen Pointer zum Buffer haben wollte und
    ich ihm einfach den Buffer gegeben habe ? ^^
    DllStructGetPtr($buffer) - auch gerafft =)

    Der einzige Punkt an dem ganzen, den ich nicht verstehe, ist:

    [autoit]

    $buffer = DllStructCreate("byte[" & $x & "]")

    [/autoit]

    schonmal vielen Dank ! =)
    limette

    Edit: kurz in der Hilfe gelesen... du sagtest ich muss das als Bytes übertragen ? Dafür steht das
    'byte' in dem DllStructCreate, die eckigen Klammern erzeugen eine Array :D und mit der Länge des Paketes in den Klammern
    wird das einfach eine Array mit so vielen Elementen wie Bytes im String ? =)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

    Einmal editiert, zuletzt von limette (7. Juni 2008 um 13:19)

  • Ui, das geht !!!!

    Aber ich bin ja foul. Datei öffnen und Variabeln eintragen.

    Ich habe es so nun getestet und das sogar mit "upload in ein Unterverzeichnis":

    Spoiler anzeigen
    [autoit]


    ; Daten na klar anpassen
    $server = "home.dknet.net"
    $username = "crazy"
    $password = "totalcrazy"
    ;$file = "public_html/testdatei.jpg" ; hier der / und nicht \
    ;$FileLocal = "E:\testdatei.jpg"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $x = _FTP_Upload( $server, $username, $password, 'public_html/testdatei.jpg' , "E:\testdatei.jpg")
    MsgBox( 0, '', $x & '-' & @error )

    [/autoit] [autoit][/autoit] [autoit]

    $x = _FTP_Upload( $server, $username, $password, 'public_html/testdatei2.jpg' , "E:\testdatei2.jpg")
    MsgBox( 0, '', $x & '-' & @error )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _FTP_Upload( $server, $username, $password, $file,$FileLocal )
    #Region connect
    Local $aiWinInetDLL = DllOpen("wininet.dll"), $ai_InternetCloseHandle
    Local $ai_InternetOpen = DllCall($aiWinInetDLL, 'long', 'InternetOpen', 'str', 'PicTransfer', 'long', 1, 'str', '', 'str', '', 'long', 0)
    If @error Or $ai_InternetOpen[0] = 0 Then
    DllClose($aiWinInetDLL)
    SetError(-1)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $i_ServerPort = 0, $l_Service = 1, $l_Context = 0, $l_InternetSession = $ai_InternetOpen[0]
    Local $ai_InternetConnect = DllCall($aiWinInetDLL , 'long', 'InternetConnect', 'long', $l_InternetSession, 'str', $server, 'int', $i_ServerPort, 'str', $username, 'str', $password, 'long', $l_Service, 'long', 0x08000000, 'long', $l_Context)
    If @error Or $ai_InternetConnect[0] = 0 Then
    $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetOpen[0])
    DllClose($aiWinInetDLL)
    SetError(-2)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $ai_ftpopenfile = DllCall( $aiWinInetDLL , 'long', 'FtpOpenFile', 'long', $ai_InternetConnect[0], 'str', $file, 'dword', 0x40000000, 'dword', 0x02, 'dword', 0 )
    If @error Or $ai_ftpopenfile[0] = 0 Then
    $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetConnect[0])
    $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetOpen[0])
    DllClose($aiWinInetDLL)
    SetError(-3)
    Return 0
    EndIf
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    #Region DataSend
    Local $fhandle = FileOpen($FileLocal,16)
    ;~ $buffer = FileRead( $fhandle )

    [/autoit] [autoit][/autoit] [autoit]

    $glen = FileGetSize($FileLocal)
    $last = Mod($glen,100)
    $x = ($glen-$last)/100
    $buffer = DllStructCreate("byte[" & $x & "]")

    [/autoit] [autoit][/autoit] [autoit]

    Dim $out, $i = 0, $result
    For $i = 1 To 101
    Select
    Case $i = 101 And $last > 0
    $x = $last
    Case $i = 101 And (Not $last)
    ExitLoop
    Case $glen = $last
    $x = $last
    $i = 101
    EndSelect
    DllStructSetData($buffer,1,FileRead($fhandle,$x))

    Local $ai_ftpwrite = DllCall( $aiWinInetDLL , 'int', 'InternetWriteFile', 'long', $ai_ftpopenfile[0], 'ptr', DllStructGetPtr($buffer), 'int', $x, 'dword*', $out )
    $result += $ai_ftpwrite[4]
    If @error Or $ai_ftpwrite[0] = 0 Then
    $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetConnect[0])
    $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetOpen[0])
    FileClose($fhandle)
    DllClose($aiWinInetDLL)
    SetError(-4)
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ToolTip( $i )
    Sleep( 20 )

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit] [autoit][/autoit] [autoit]

    FileClose($fhandle)
    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    #region disconnect
    $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetConnect[0])
    $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetOpen[0])
    If @error Or $ai_InternetCloseHandle[0] = 0 Then
    DllClose($aiWinInetDLL)
    SetError(-5)
    Return 0
    EndIf
    #EndRegion
    DllClose($aiWinInetDLL)
    Return 1
    EndFunc

    [/autoit]

    Und da ich ja eine foule Schnecke bin, habe ich gleich geprüft, ob man das auch gleich mit zwei und mehr Bildern durchlaufen lassen kann. Ja, nach jedem Bild einmal bestätigen und dann geht es weiter.


    Posting-Ergebnis:
    limette= super Posting
    progandy = super Lösung ; das Lösungsmittel möchte ich mal im Kopf haben, was Progandy "eingenommen" hat. :rofl: (Spass)

    LG, Crazy-A.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Danke =)
    Sorry wenn ich gestern Abend etwas schnell angepisst war ;)
    Aber sitzen wirklich schon seit November 2007 an einem Programm und
    brauchen seitdem den Status des FTP-Uploads..
    Da lagen bei mir einfach die Nerven blank, wo doch endlich diese Super-Idee mit
    dem InternetWriteFile fiel ! :D

    Danke an alle =)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.


  • Der einzige Punkt an dem ganzen, den ich nicht verstehe, ist:

    [autoit]

    $buffer = DllStructCreate("byte[" & $x & "]")

    [/autoit]


    Das erstellt ein Byte-Array mit der angegebenen Länge. Der Buffer besteht also aus $x bytes. ( Er muss lang genug sein, um dden Teil der Datei einzulesen, den wir hochladen.)
    Und im DLLCall hattest du den Fehler, dass du einen String übergeben hast. Das erstelllt einen Buffer, aber der besteht eben aus einem String und kann nicht für bytes verwendet werden ;)

    PS: bei Dateien < 100 bytes müsste es noch einen Fehler geben :(

  • Nun, an die Dateien < 100 Byte muss man sich nochmal setzen,
    aber es geht bei unserem Programm um Bilder...
    Und Bilder, die kleiner sind als 100 Byte, trifft man nicht so oft ;)

    Könnte man nicht einfach eine If-Clause mit einbringen und wenn
    die Datei <= 100 Byte ist sie in 1Byte-Schritten hochladen ?

    mfg limette =)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Danke =)
    Sorry wenn ich gestern Abend etwas schnell angepisst war ;)
    ...
    Da lagen bei mir einfach die Nerven blank, ...

    Ist doch schon (für mich auf jeden Fall) vergessen. Alzheimer-Gruß. ;)

    Zu dem anderen mit in 1-Byte-Schritte, da würde ich vorschlagen, das man es dann eher auf 10-Byte-Schritte abstuft. Aber ist von meiner Seite nur ein Vorschlag.

    Crazy-A

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl