HTTP Upload

  • Hallo Leute,
    hab mir mal was vorgenommen und wollte wissen ob es möglich ist.

    Ich benutze öfters mal eine Datei als TODO List, sagen wir mal es ist einfach nur eine txt.

    Und diese Datei möchte ich direkt abrufen von meinem Heim und Arbeitsrechner.
    Problem: Das Firmennetz hat den ftp Port geschlossen.
    Jetzt woll ich mir einfach mal ein Tool basteln bei dem ich zwei buttons habe open und save oder so.. soll aber über http uploaden.

    Könnt ihr mir vielleicht ein Tipp geben ob man das hinkriegen kann?

    Grüße Remax

  • TextDateien kann man so machen:

    Spoiler anzeigen
    [autoit]

    ; Many Code from http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/146306
    #include<File.au3>
    #include<Array.au3>
    Global $MIMETypes[200][2]
    Local $line
    $mime = FileOpen(@ScriptDir & "\MIMETypes.txt", 0)
    For $i = 0 To 199
    $line = FileReadLine($mime)
    If @error = -1 Then ExitLoop
    $line = StringSplit($line, @TAB)
    $MIMETypes[$i][0] = $line[1]
    $MIMETypes[$i][1] = $line[2]
    Next
    For $i = $i To 199
    $MIMETypes[$i][0] = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
    Next
    FileClose($mime)
    _ArraySort($MIMETypes, 0, 0, 0, 2)
    ;~ _ArrayDisplay($MIMETypes)

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

    Func post_multipart($host, $selector, ByRef $fields, ByRef $files)
    ;~ """
    ;~ Post fields and files to an http host as multipart/form-data.
    ;~ fields is a sequence of (name, value) elements for regular form fields.
    ;~ files is a sequence of (name, filename, value) elements for data to be uploaded as files
    ;~ Return the server's response page.
    ;~ """
    Local $Return = encode_multipart_formdata($fields, $files)
    $content_type = $Return[0]
    ;~ $body = $Return[1]
    $h = _InetConnect($host)
    $Request = "POST " & $h[1] & " HTTP/1.1" & @CRLF
    $Request &= ('Host: ' & $h[2]) & @CRLF
    $Request &= ('content-type: ' & $content_type) & @CRLF
    $Request &= ('content-length: ' & StringLen($Return[1])) & @CRLF
    $Request &= @CRLF
    ConsoleWrite($Request & $Return[1] & @CRLF)
    _InetSend($h, $Request & $Return[1])
    ;~ _InetSend($h, $Return[1])
    ;~ errcode, errmsg, headers = h.getreply()
    Return _InetReceive($h)
    EndFunc ;==>post_multipart
    Func encode_multipart_formdata($fields, $files)
    ;~ """
    ;~ fields is a sequence of (name, value) elements for regular form fields.
    ;~ files is a sequence of (name, filename, value) elements for data to be uploaded as files
    ;~ Return (content_type, body) ready for httplib.HTTP instance
    ;~ """
    Local Const $BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$'
    ;~ CRLF = '\r\n'
    $L = ""
    For $i = 0 To UBound($fields) - 1
    $L &= ('--' & $BOUNDARY) & @CRLF
    $L &= ('Content-Disposition: form-data; name="' & $fields[$i][0] & '"') & @CRLF
    $L &= @CRLF
    $L &= $fields[$i][1] & @CRLF
    Next
    For $i = 0 To UBound($files) - 1
    $L &= ('--' & $BOUNDARY) & @CRLF
    $L &= ('Content-Disposition: form-data; name="' & $files[$i][0] & '"; filename="' & $files[$i][1] & '"') & @CRLF
    $content_type = get_content_type($files[$i][1])
    $L &= ('Content-Type: ' & $content_type) & @CRLF
    $L &= @CRLF
    If StringLeft($content_type, 5) <> "text/" Then
    $f = FileOpen($files[$i][1], 16)
    $L &= FileRead($f) & @CRLF
    FileClose($f)
    Else
    $L &= FileRead($files[$i][1]) & @CRLF
    EndIf
    Next
    $L &= ('--' & $BOUNDARY & '--') & @CRLF
    $L &= @CRLF

    $content_type = 'multipart/form-data; boundary="' & $BOUNDARY & '"'
    Local $Return[2] = [$content_type, $L]
    ;~ return content_type, body
    Return $Return
    EndFunc ;==>encode_multipart_formdata

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

    ;~ Func get_content_type(filename):
    ;~ return mimetypes.guess_type(filename)[0] or 'application/octet-stream'
    ;~ EndFunc
    Func get_content_type($path)
    Local $szDrive, $szDir, $szFName, $szExt
    _PathSplit($path, $szDrive, $szDir, $szFName, $szExt)
    ConsoleWrite(StringTrimLeft($szExt, 1) & @CRLF)
    If StringTrimLeft($szExt, 1) = "" Then Return 'application/octet-stream'
    Local $mimeid = _ArrayBinarySearch2D($MIMETypes, StringTrimLeft($szExt, 1))
    ConsoleWrite($mimeid & @error & @CRLF)
    If $mimeid = -1 Then Return SetError(1, 0, 'application/octet-stream')
    Return $MIMETypes[$mimeid][1]
    EndFunc ;==>get_content_type

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

    ;===============================================================================
    ;
    ; Function Name: _ArrayBinarySearch()
    ; Description: Uses the binary search algorithm to search through a
    ; 1-dimensional array.
    ; Author(s): Jos van der Zande <jdeb at autoitscript dot com>
    ;
    ;===============================================================================
    Func _ArrayBinarySearch2D(Const ByRef $avArray, $vValue, $iStart = 0,$Column=0, $iEnd = 0)
    If Not IsArray($avArray) Then Return SetError(1, 0, -1)

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

    Local $iUBound = UBound($avArray) - 1

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

    ; Bounds checking
    If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
    If $iStart < 0 Then $iStart = 0
    If $iStart > $iEnd Then Return SetError(4, 0, -1)

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

    Local $iMid = Int(($iEnd + $iStart) / 2)

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

    If $avArray[$iStart][$Column] > $vValue Or $avArray[$iEnd][$Column] < $vValue Then Return SetError(2, 0, -1)

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

    ; Search
    While $iStart <= $iMid And $vValue <> $avArray[$iMid][$Column]
    If $vValue < $avArray[$iMid][$Column] Then
    $iEnd = $iMid - 1
    Else
    $iStart = $iMid + 1
    EndIf
    $iMid = Int(($iEnd + $iStart) / 2)
    WEnd

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

    If $iStart > $iEnd Then Return SetError(3, 0, -1) ; Entry not found

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

    Return $iMid
    EndFunc ;==>_ArrayBinarySearch

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

    ; Made from _InetGetSourcePost
    Func _InetConnect($sURL)
    Local $iSocket, $sHeader, $sRecv, $iIP, $sHost, $aRegExp, $sHttp1, $iErr, $iSend

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

    If $sURL = '' Then Return SetError(1, 0, 0)

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

    If StringLeft($sURL, 7) <> 'http://' And StringLeft($sURL, 8) <> 'https://' Then $sURL = "http://" & $sURL
    ;~ If StringRight($sURL, 1) <> "/" Then $sURL &= "/"

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

    $aRegExp = StringRegExp($sURL, "http?://(.*?)/", 3)
    If @error Then Return SetError(2, 0, 0)

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

    $sHost = $aRegExp[0]
    If $sHost = '' Then Return SetError(3, 0, 0)

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

    $sHttp1 = StringTrimLeft($sURL, StringInStr($sURL, "/", -1, 3) - 1)
    If $sHttp1 = '' Then Return SetError(3, 0, 0)
    TCPStartup() ;If not already done
    $iIP = TCPNameToIP($sHost)
    If $iIP = '' Or StringInStr($iIP, ".") = 0 Then Return SetError(4, 0, 0)
    $iSocket = TCPConnect($iIP, 80)
    If @error Or $iSocket < 0 Then Return SetError(5, 0, 0)
    Local $Return[3] = [$iSocket, $sHttp1, $sHost]
    Return $Return
    EndFunc ;==>_InetConnect

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

    Func _InetSend($iSocket, $sData)
    Local $iSend = TCPSend($iSocket[0], $sData)
    If @error Or $iSend < 1 Then Return SetError(6, 0, 0)
    Return 1
    EndFunc ;==>_InetSend
    Func _InetReceive($iSocket)
    Local $sRecv, $aReturn, $iErr
    While 1
    $sRecv = TCPRecv($iSocket[0], 1024)
    $iErr = @error
    If $sRecv <> '' Then
    While 1
    $sRecv &= TCPRecv($iSocket[0], 1024)
    If @error Then ExitLoop 2
    WEnd
    EndIf
    If $iErr Then Return SetError(7, 0, 0)
    WEnd
    TCPShutdown()
    Local $aReturn[2]
    $aReturn[0] = StringLeft($sRecv, StringInStr($sRecv, @CRLF & @CRLF) - 1)
    $aReturn[1] = StringTrimLeft($sRecv, StringLen($aReturn[0]) + 4)
    Return $aReturn
    EndFunc ;==>_InetReceive

    [/autoit]


    Bsp:

    [autoit]

    Local $fld[2][2] = [["password","PW123"],["filename","test.txt"]]
    Local $fle[1][2] = [["datei","D:\TEMP\Test.txt"]]
    $x = post_multipart("localhost/d.php","",$fld,$fle)
    ConsoleWrite($x[0] & @CRLF)
    ConsoleWrite($x[1] & @CRLF)

    [/autoit]


    PHP-Script für den Server ( d.php )

    PHP
    <?php
    ($_POST["password"] == "PW123") Or die("NOT AUTH");
    (!empty($_POST["filename"])) Or die("NO FILENAME");
    move_uploaded_file($_FILES['datei']['tmp_name'], $_POST["filename"]);
    readfile($_POST["filename"]);
    ?>


    Für andere Dateien geht es (noch) nicht, da Base64 Encodeing fehlt