2017-03-13 1 views
0

Ich arbeite an einem Sub, das einen HTTP-Post verwendet, um eine Datei auf einen Server hochzuladen. Ich habe bereits den gesamten Code ausgearbeitet, um die Postanforderung tatsächlich zu senden, aber ich kann nicht herausfinden, wie ich die Datei in das entsprechende Format bringen kann. Der Server erwartet die Bytes der Datei als String, aber egal, welchen Ansatz ich zum Erstellen der Zeichenfolge verwende, die Werte entsprechen nicht den Erwartungen. HierDatei in VBA als Zeichenfolge lesen

ist der Code, den ich derzeit haben:

Sub Test() 
    Dim FileNum As Integer 
    Dim TestString As String 
    Dim TestBytes() As Byte 
    Dim TestByte As Variant 

    FileNum = FreeFile 
    Open ActiveDocument.Path & "\" & ActiveDocument.name For Binary Access Read As #FileNum 'Open document to write to string 
    ReDim TestBytes(LOF(FileNum) - 1) 
    Get FileNum, , TestBytes 
    Close FileNum 
    For Each TestByte In TestBytes 
     TestString = TestString & Hex(TestByte) 
    Next TestByte 
    Debug.Print TestString 
End Sub 

Die Ausgabe sieht ungefähr so ​​aus (abgeschnitten, da die vollständige Zeichenfolge offensichtlich ziemlich lang):

504B3414060800021076DD8E8C9D130825B436F6E74656E745F54797065735D2E786D6C20... 

Das Problem ist, die Beispiel Ausgang Ich habe es sagt sollte wie folgt aussehen:

UEsDBBQABgAIAAAAIQCuTjGvewEAAAIGAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIooAACA... 

Ich nahm an, das Problem war, dass mein Testcode versucht, die Bytes als hex Werte zu codieren, während das Beispiel offensichtlich nicht in hex ist, aber wenn ich versuche, die Bytes der Datei direkt als String auszugeben, bekomme ich sehr viele ungültige Figuren. Hier ist der Code:

Sub Test() 
    Dim FileNum As Integer 
    Dim TestString As String 
    Dim TestBytes() As Byte 
    Dim TestByte As Variant 

    FileNum = FreeFile 
    Open ActiveDocument.Path & "\" & ActiveDocument.name For Binary Access Read As #FileNum 'Open document to write to string 
    TestString = String$(LOF(FileNum), Chr(32)) 'Fill string with blank space to set string length 
    Get FileNum, , TestString 'Write binary data from file to string 
    Debug.Print TestString 
End Sub 

Und hier ist der Ausgang:

PK  ! vÝŽŒ p ... 

Gibt es etwas, was ich bin fehlt, wie ich die Bytes kodieren kann zu bekommen Ausgabe, die die gleiche wie das Beispiel Ausgabe codiert ist? Wenn eine ähnliche Operation in einer anderen Sprache ausgeführt wird (z. B. Java mit readFileToString), wie wird die Zeichenfolge codiert?

+2

'UEsDBB ... sieht aus wie Base64. Das Format wird durch den Header "Content-Transfer-Encoding" gesteuert. Sie müssen nicht codieren, aber Sie können die Bytes direkt schreiben - die Art und Weise, wie Sie dies tun, hängt davon ab, wie Sie die multipart/form-data-Anfrage erstellen (vorausgesetzt, das ist was Sie verwenden). –

+0

(Ihre Hex-Methode ist auch dann ungültig, wenn sie erlaubt wäre, weil Sie einzelne Werte mit einer führenden '0' auffüllen müssen) –

+0

Danke, das hilft sehr. Ich bin immer noch ziemlich unerfahren in der Programmierung im Allgemeinen, ich war mir Base64 nicht bewusst. – Toast

Antwort

1

Mit Alex K. Rat in den Kommentaren oben, und die Base64-Codierung Funktion found here, kam ich zu dieser Lösung:

Sub Test() 
    Dim FileNum As Integer 
    Dim TestString As String 
    Dim TestBytes() As Byte 
    Dim TestByte As Variant 

    FileNum = FreeFile 
    Open ActiveDocument.Path & "\" & ActiveDocument.name For Binary Access Read As #FileNum 'Open document to write to string 
    TestString = String$(LOF(FileNum), Chr(32)) 'Fill string with blank space to set string length 
    Get FileNum, , TestString 'Write binary data from file to string 
    TestString = EncodeBase64(TestString) 

    Debug.Print TestString 
End Sub 

Function EncodeBase64(text As String) As String 
    Dim arrData() As Byte 
    arrData = StrConv(text, vbFromUnicode) 

    Dim objXML As MSXML2.DOMDocument 
    Dim objNode As MSXML2.IXMLDOMElement 

    Set objXML = New MSXML2.DOMDocument 
    Set objNode = objXML.createElement("b64") 

    objNode.DataType = "bin.base64" 
    objNode.nodeTypedValue = arrData 
    EncodeBase64 = objNode.text 

    Set objNode = Nothing 
    Set objXML = Nothing 
End Function 

Welche die richtige Zeichenfolge ausgibt:

UEsDBBQABgAIAAAAIQCuTjGvewEAAAIGAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIooAACA...