Search code examples
excelvbabytedropboxdropbox-api

Uploading to Dropbox but tiny file size


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

Solution

  • 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