Sample code for 30+ languages & platforms
DataFlex Requires Chilkat v11.7.0+

Box: Upload a File from BinData

See more Box Examples

Run the reusable setup once per HttpCurl object, then select names and execute the operation. The setup is repeated here only to make this published example independently runnable. Resolve documents by name using HttpCurl, then upload a small local PDF from BinData with Rest. The transfer is explicit after dependency resolution; no ID is entered by the caller.

See the Box API guide for setup and the complete workflow.

Chilkat DataFlex Downloads

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Handle hoCurl
    Handle hoSetupCommand
    Integer iSetupReplacements
    String sParentName
    String sFolderName
    Handle hoAuthorizedCommand1
    Integer iHeaderReplacement1
    Variant vData
    Handle hoData
    Handle hoRest
    Variant vOauth2
    Handle hoOauth2
    Handle hoAttributes
    String sResponseBody
    Handle hoResult
    String sTemp1
    Integer iTemp1
    Boolean bTemp1

    Move False To iSuccess

    //  Requires Chilkat 11.7.0 or later and a previously unlocked Chilkat bundle.
    //  See Global Unlock Sample.
    //  Guide: Box API Guide.

    Move False To iSuccess

    //  BEGIN ONE-TIME SETUP
    //  This block is repeated so each published example can run on its own.
    //  In an application, run the setup example once and pass the SAME curl object
    //  to operation code below. Do not recreate it for every operation.
    //  See Reusable Box HttpCurl Setup.
    Get Create (RefClass(cComChilkatHttpCurl)) To hoCurl
    If (Not(IsComObjectCreated(hoCurl))) Begin
        Send CreateComObject of hoCurl
    End
    Send ComSetVar To hoCurl "access_token" "BOX_ACCESS_TOKEN"
    Send ComSetVar To hoCurl "parent_name" "/"
    //  Box's fixed root ID is an implementation detail; callers supply names.
    Send ComSetVar To hoCurl "parent_id" "0"
    Get Create (RefClass(cComChilkatStringBuilder)) To hoSetupCommand
    If (Not(IsComObjectCreated(hoSetupCommand))) Begin
        Send CreateComObject of hoSetupCommand
    End

    //  Register findParent; registration sends no request.
    Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/folders/0/items?limit=1000&fields=id,type,name" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
    Get ComGetVar Of hoCurl "access_token" To sTemp1
    Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
    Get ComGetAsString Of hoSetupCommand To sTemp1
    Get ComAddFunction Of hoCurl "findParent" sTemp1 To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoCurl To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  Register findFolder; registration sends no request.
    Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/folders/{{parent_id}}/items?limit=1000&fields=id,type,name" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
    Get ComGetVar Of hoCurl "access_token" To sTemp1
    Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
    Get ComGetAsString Of hoSetupCommand To sTemp1
    Get ComAddFunction Of hoCurl "findFolder" sTemp1 To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoCurl To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  Register findFile; registration sends no request.
    Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/folders/{{folder_id}}/items?limit=1000&fields=id,type,name" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
    Get ComGetVar Of hoCurl "access_token" To sTemp1
    Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
    Get ComGetAsString Of hoSetupCommand To sTemp1
    Get ComAddFunction Of hoCurl "findFile" sTemp1 To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoCurl To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  Register findDestination; registration sends no request.
    Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/folders/0/items?limit=1000&fields=id,type,name" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
    Get ComGetVar Of hoCurl "access_token" To sTemp1
    Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
    Get ComGetAsString Of hoSetupCommand To sTemp1
    Get ComAddFunction Of hoCurl "findDestination" sTemp1 To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoCurl To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  Register getFileDetails; registration sends no request.
    Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/files/{{file_id}}?fields=id,sha1,file_version" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
    Get ComGetVar Of hoCurl "access_token" To sTemp1
    Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
    Get ComGetAsString Of hoSetupCommand To sTemp1
    Get ComAddFunction Of hoCurl "getFileDetails" sTemp1 To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoCurl To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  Register getEnterprise; registration sends no request.
    Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/users/me?fields=enterprise" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
    Get ComGetVar Of hoCurl "access_token" To sTemp1
    Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
    Get ComGetAsString Of hoSetupCommand To sTemp1
    Get ComAddFunction Of hoCurl "getEnterprise" sTemp1 To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoCurl To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  Register output rules once. Chilkat 11.7.0 evaluates {{name}} variables
    //  when extracting each output, using the current value at that time.
    Get ComAddOutput2 Of hoCurl "findParent" "entries" "name" "{{parent_name}}" True "id" "parent_id" To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoCurl To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComAddOutput2 Of hoCurl "findFolder" "entries" "name" "{{folder_name}}" True "id" "folder_id" To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoCurl To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComAddOutput2 Of hoCurl "findFile" "entries" "name" "{{file_name}}" True "id" "file_id" To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoCurl To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComAddOutput2 Of hoCurl "findDestination" "entries" "name" "{{destination_name}}" True "id" "destination_id" To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoCurl To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComAddOutput Of hoCurl "getFileDetails" "file_version.id" "file_version_id" To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoCurl To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComAddOutput Of hoCurl "getFileDetails" "sha1" "file_sha1" To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoCurl To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComAddOutput Of hoCurl "getEnterprise" "enterprise.id" "enterprise_id" To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoCurl To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    //  END ONE-TIME SETUP
    //  The name lookups below assume each listing fits in one page (1000 items).
    //  Parent and destination names select root children; folder_name selects a child
    //  of parent_name. "/" selects the root parent. These are not arbitrary paths.

    //  BEGIN OPERATION -- keep the configured object when reusing it.
    //  Inputs are names. Retain cached IDs when the selected names have not changed.
    Move "/" To sParentName
    Move "documents" To sFolderName
    Get ComGetVar Of hoCurl "parent_name" To sTemp1
    Get ComVarDefined Of hoCurl "parent_id" To bTemp1
    If ((sTemp1 <> sParentName) Or ((sParentName = "/") And (bTemp1 = False))) Begin
        Send ComSetVar To hoCurl "parent_name" sParentName
        Send ComClearVar To hoCurl "parent_id"
        Send ComClearVar To hoCurl "folder_id"
        Send ComClearVar To hoCurl "file_id"
        Send ComClearVar To hoCurl "file_version_id"
        Send ComClearVar To hoCurl "file_sha1"
        If (sParentName = "/") Begin
            Send ComSetVar To hoCurl "parent_id" "0"
        End

    End

    Get ComGetVar Of hoCurl "folder_name" To sTemp1
    If (sTemp1 <> sFolderName) Begin
        Send ComSetVar To hoCurl "folder_name" sFolderName
        Send ComClearVar To hoCurl "folder_id"
        Send ComClearVar To hoCurl "file_id"
        Send ComClearVar To hoCurl "file_version_id"
        Send ComClearVar To hoCurl "file_sha1"
    End

    //  Resolve the named destination first. HttpCurl does not expand variables
    //  inside multipart -F attributes in the tested build, so this upload is two phases.
    Send ComClearTargetOutput To hoCurl "*"
    Get Create (RefClass(cComChilkatStringBuilder)) To hoAuthorizedCommand1
    If (Not(IsComObjectCreated(hoAuthorizedCommand1))) Begin
        Send CreateComObject of hoAuthorizedCommand1
    End
    Get ComSetString Of hoAuthorizedCommand1 'curl -X GET "https://api.box.com/2.0/folders/{{folder_id}}?fields=id" -H "Authorization: Bearer {{access_token}}"' To iSuccess
    Get ComGetVar Of hoCurl "access_token" To sTemp1
    Get ComReplace Of hoAuthorizedCommand1 "{{access_token}}" sTemp1 To iHeaderReplacement1
    Get ComGetAsString Of hoAuthorizedCommand1 To sTemp1
    Get ComDoYourThing Of hoCurl sTemp1 To iSuccess
    Get ComStatusCode Of hoCurl To iTemp1
    If ((iSuccess <> True) Or (iTemp1 <> 200)) Begin
        Get ComStatusCode Of hoCurl To iTemp1
        Showln "Box request failed. HTTP status: " iTemp1
        Get ComFailReason Of hoCurl To iTemp1
        Showln "Failure reason: " iTemp1
        Get ComResponseBodyStr Of hoCurl To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get Create (RefClass(cComChilkatBinData)) To hoData
    If (Not(IsComObjectCreated(hoData))) Begin
        Send CreateComObject of hoData
    End
    Get ComLoadFile Of hoData "qa_data/pdf/invoice.pdf" To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoData To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get Create (RefClass(cComChilkatRest)) To hoRest
    If (Not(IsComObjectCreated(hoRest))) Begin
        Send CreateComObject of hoRest
    End
    Get Create (RefClass(cComChilkatOAuth2)) To hoOauth2
    If (Not(IsComObjectCreated(hoOauth2))) Begin
        Send CreateComObject of hoOauth2
    End
    Get ComGetVar Of hoCurl "access_token" To sTemp1
    Set ComAccessToken Of hoOauth2 To sTemp1
    Get pvComObject of hoOauth2 to vOauth2
    Get ComSetAuthOAuth2 Of hoRest vOauth2 To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoRest To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComConnect Of hoRest "upload.box.com" 443 True True To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoRest To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get Create (RefClass(cComChilkatJsonObject)) To hoAttributes
    If (Not(IsComObjectCreated(hoAttributes))) Begin
        Send CreateComObject of hoAttributes
    End
    Get ComUpdateString Of hoAttributes "name" "invoice.pdf" To iSuccess
    Get ComGetVar Of hoCurl "folder_id" To sTemp1
    Get ComUpdateString Of hoAttributes "parent.id" sTemp1 To iSuccess
    Get ComAddHeader Of hoRest "Content-Type" "multipart/form-data" To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoRest To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Set ComPartSelector Of hoRest To "1"
    Get ComAddHeader Of hoRest "Content-Disposition" 'form-data; name="attributes"' To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoRest To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComEmit Of hoAttributes To sTemp1
    Get ComSetMultipartBodyString Of hoRest sTemp1 To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoRest To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Set ComPartSelector Of hoRest To "2"
    Get ComAddHeader Of hoRest "Content-Disposition" 'form-data; name="file"; filename="invoice.pdf"' To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoRest To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComAddHeader Of hoRest "Content-Type" "application/pdf" To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoRest To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get pvComObject of hoData to vData
    Get ComSetMultipartBodyBd Of hoRest vData To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoRest To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Set ComPartSelector Of hoRest To "0"
    Get ComFullRequestMultipart Of hoRest "POST" "/api/2.0/files/content" To sResponseBody
    Get ComLastMethodSuccess Of hoRest To bTemp1
    If (bTemp1 <> True) Begin
        Get ComLastErrorText Of hoRest To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComResponseStatusCode Of hoRest To iTemp1
    If (iTemp1 <> 201) Begin
        Get ComResponseStatusCode Of hoRest To iTemp1
        Showln "Upload failed: " iTemp1
        Showln sResponseBody
        Procedure_Return
    End

    Get Create (RefClass(cComChilkatJsonObject)) To hoResult
    If (Not(IsComObjectCreated(hoResult))) Begin
        Send CreateComObject of hoResult
    End
    Get ComLoad Of hoResult sResponseBody To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoResult To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComStringOf Of hoResult "entries[0].id" To sTemp1
    Showln "Uploaded file ID: " sTemp1
    Send ComSetVar To hoCurl "file_name" "invoice.pdf"
    Get ComStringOf Of hoResult "entries[0].id" To sTemp1
    Send ComSetVar To hoCurl "file_id" sTemp1
    Send ComClearVar To hoCurl "file_version_id"
    Send ComClearVar To hoCurl "file_sha1"


End_Procedure