Upload einer Datei per POST Multipart ( winhttprequest / InetGet )

  • Moin,

    ich bastle gerade für einen bekannten einen Waren-Bestandsabgleich für seinen Webshop. Das habe ich schon für verschiedene Plattformen mit AutoIt prima hinbekommen - in der Regel muss man sich die Daten der Artikel aus der Datenbank holen und in einer Text-Datei richtig aufbereiten - mit AutoIt ein Kinderspiel.

    Nun nutzt er eine weitere Plattform (Pricemnister.com) - die machen den Up- und Download über https-Request.

    Den aktuellen Artikelbestand z.B. mit InetGet abzurufen klappe schon nach 2 Minuten probieren in AutoIt:

    [autoit]


    Dim $sDownloadpath = "D:\Bestandsabgleich\Priceminister\priceminister.xml"
    $iSize = InetGet('https://ws.priceminister.com/stock_ws?action=export&login=BENUTZERNAME&pwd=BENUTZERID&version=2012-10-23', $sDownloadpath, 2, 0)

    [/autoit]


    wenn $iSzte größer als 0 ist hat alles geklappt und ich meine Artikel-Datei unter "D:\Bestandsabgleich\Priceminister\priceminister.xml".

    Das klappt ja und schreibe es auch nur um die Syntax zu verdeutlichen - man muss also eine entsprechende URL aufrufen und löst damit das gewünschte auf den Server aus.

    Nun will ich aber eine Datei mit den aktuellen Artikelbestand hochladen.

    Die Datei ist simpel aufgebaut:

    [autoit]


    sku;quantity
    10001;344
    10002;376
    10003;267

    [/autoit]


    Es ist eine schnöde Textdatei im CSV Format wo zuerst die Artikelnummer und dann der Bestand kommt.

    Auch zum übertragen dieser Datei muss ich wieder eine bestimmte URL aufrufen - aber diesmal dann die Datei im "Multipart Modus" anhängen.
    Die URL ist

    https://ws.priceminister.com/stock_ws?action=import&login=BENUTZERID&pwd=BENUTZERIDversion=2010-09-20&mappingalias=QUANTITY

    Naja, soweit ich es verstanden habe omme ich nun mit InetGet nicht weiter - ich habe hier kein "POST" - heisst ja auch "InetGet".
    Etwas gegoogelt und festgestellt das man z.B. das ganze auch per "winhttprequest" Object machen kann.

    Meinen InetGet-Aufruf bekam ich auch schnell nachgebaut .... woran ich scheitere ist die Datei daran zu hängen und zu senden ...
    Es gibt ganz viele Beispiele im Internet für AutoIt und VBA etc über den Aufruf der Post-Methode ... aber da wird immer nur eine Eingabe etc. gesendet - über ein "Multipartfile" war nichts dabei was sich mir erschlossen hätte.

    Hier mein Code - ist nur der Prototyp für den Funktionstest - habe ich mir aus einem englischen Beispiel kopiert und nur angepasst.

    [autoit]


    $sDaten = FileRead("D:\Bestandsabgleich\Priceminister\PM-Bestand-2013-08-12-V1.csv")

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

    $oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
    ;Post request
    $oHTTP.Open("POST", "https://ws.priceminister.com/stock_ws?action=import&login=BENUTZERNAME&pwd=BENUTZERID&version=2010-09-20&mappingalias=QUANTITY" , False)
    ;Add User-Agentheader
    $oHTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 4.0.20506)")
    ;Add Referrer
    ;header$oHTTP.SetRequestHeader("Referrer", "http://www.REFERRERURL.com")
    ;Add Content-Type
    $oHTTP.SetRequestHeader("Content-Type", "multipart/form-data")
    ;$oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    ;Send POST request
    $oHTTP.Send($sDaten)
    ;Get received data
    $oReceived = $oHTTP.ResponseText
    ConsoleWrite($oReceived)

    [/autoit]

    Hier habe ich versucht die Datei einfach einzulesen und dann per "$oHTTP.Send($sDaten)" zu senden - nein das geht nicht ...
    Ich habe auch schon probiert:
    * den Text in der Datei einfach zu senden
    * den Text in Binary umzuwandeln und zu senden

    Vom Server bekomme ich immer ein Fehlermeldung:

    [autoit]

    <message>Server not able to fullfill request.</message>
    <details>
    <detail><![CDATA[An error occurred while submitting the file]]></detail>
    </details>
    </error>

    [/autoit]

    Im Beitrag Fileuplaod via POST habe ich gesehen das die Daten doch mehr aufbereitet werden müssen?

    Im Moment hat es bei mir noch nicht "klick" gemacht und ich das ganze noch nicht durchschaut .... ich hab mir auch schon die Windows-Version von CURL geholt ... aber das Ding erschlägt mich auch mit Parametern und die Bespiele sind dünn.

    Bin für jeden Tipp dankbar,

    BLinzer

  • Nachtrag:

    Mit Curl für Windows habe ich es dann doch hinbekommen (Download unter http://curl.haxx.se/download.html :(

    [autoit]

    curl.exe -k -F "FileUpload=@D:\Bestandsabgleich\Priceminister\PM-Bestand-2013-08-12-V1.csv" "https://ws.priceminister.com/stock_ws?action=import&login=BENUTZERNAME&pwd=BENUTZERID&version=2010-09-20&mappingalias=QUANTITY"

    [/autoit]


    Aber ich mag nicht unbedingt externe Programme aufrufen ....

  • Mit cURL funktioniert mein Upload auch aber mit Autoit bring ich das nicht hin.

    Hast du zufälligerweise herausgefunden wie man die Rückgabe der curl.exe mit autoit abfängt?

    ShellExecuteWait gibt ja nur 0 zurück wenn erfolgreich ich suche aber nach dem was $oHTTP.ResponseText zurück geben müsste.