2

I have a VBA function in Excel which creates a document.docx and then uploads it to Dropbox. It is successfully creating a file in Dropbox, but it can't be opened because it is only 2 bytes in size. Why is there no content in this file? I don't really know how files actually work, it it something to do with the script converting the content to bytes?

Public Sub dropboxUpload()
Dim req As MSXML2.ServerXMLHTTP60
Dim strFile As String
Dim Pos1 As Integer
Dim Pos2 As Integer
Set req = New MSXML2.ServerXMLHTTP60
Dim arg As String

Dim content As Byte
content = ReadByteArrFromFile("C:\Users\me\Desktop\Folder\document.docx")
FileName = "document.docx"
arg = "{""path"":""/Work/" & FileName & """,""mode"":{"".tag"":""add""},""autorename"":true,""mute"":false}"
req.Open "POST", "https://content.dropboxapi.com/2/files/upload", False
req.setRequestHeader "Authorization", "Bearer xxxxx"

req.setRequestHeader "Content-Type", "application/octet-stream"
req.setRequestHeader "Content-length", Len(Result)
req.setRequestHeader "Dropbox-API-Arg", arg
req.setRequestHeader "User-Agent", "api-explorer-client"
req.Send content

If req.Status = 200 Then '200 = OK
    'MsgBox req.Status & ": " & req.StatusText
    Debug.Print req.responseText
Else
    MsgBox req.Status & ": " & req.StatusText
    Debug.Print req.responseText
End If
End Sub

Function ReadByteArrFromFile(filePath) As Byte()
    Dim buff() As Byte
    Dim fileNumb As Integer
    fileNumb = FreeFile
    Open filePath For Binary Access Read As fileNumb
    ReDim buff(0 To LOF(fileNumb) - 1)
    Get fileNumb, , buff
    Close fileNumb
    ReadByteArrFromFile = buff
End Function
Pᴇʜ
  • 56,719
  • 10
  • 49
  • 73
Brad
  • 1,019
  • 1
  • 9
  • 22
  • Are you setting Content-length correctly? – Tim Williams Jul 07 '21 at 04:49
  • What is `Result` the variable is not defined (unless it is global). Please clarify and make sure you use `Option Explicit`. You probably meant to use `Len(content)` instead of `Len(Result)`? – Pᴇʜ Jul 07 '21 at 07:52

1 Answers1

1

Try setting the correct Content-length value:


    Dim arg As String
    Dim content As Byte, fPath as string
    
    fPath = "C:\Users\me\Desktop\Folder\document.docx"
    
    FileName = "document.docx"
    
    arg = "{""path"":""/Work/" & FileName & """,""mode"":{"".tag"":""add""},""autorename"":true,""mute"":false}"
    
    req.Open "POST", "https://content.dropboxapi.com/2/files/upload", False
    req.setRequestHeader "Authorization", "Bearer xxxxx"
    
    req.setRequestHeader "Content-Type", "application/octet-stream"
    req.setRequestHeader "Content-length", FileLen(fPath) '<<< set the correct size
    req.setRequestHeader "Dropbox-API-Arg", arg
    req.setRequestHeader "User-Agent", "api-explorer-client"
    req.Send ReadByteArrFromFile(fPath)
    
    If req.Status = 200 Then '200 = OK
        'MsgBox req.Status & ": " & req.StatusText
        Debug.Print req.responseText
    Else
        MsgBox req.Status & ": " & req.StatusText
        Debug.Print req.responseText
    End If

End Sub
Tim Williams
  • 154,628
  • 8
  • 97
  • 125