functions/New-CwmApiDocument.ps1

function New-CwmApiDocument {
    <#
    .SYNOPSIS
    Uploads a document to Connectwise
 
    .DESCRIPTION
    This will upload a file on the local computer to a specified item in ConnectWise Mange
 
    .PARAMETER File
    The file to upload (FileInfo item, created by Get-Item "Path/to/item/file.xyz" )
     
    .PARAMETER RecordType
    Entity type to attach document to
 
    .PARAMETER RecordId
    Entity to attach document to
     
    .PARAMETER PrivateFlag
    Whether to make the deocument private
 
    .PARAMETER ReadOnlyFlag
    Whether to make the deocument readyonly
 
    .PARAMETER IsAvatar
 
    .OUTPUTS
    [System.Object] custom object containing API response
 
    .EXAMPLE
 
    .NOTES
    #>


    [CmdletBinding()]
    Param (
        [parameter(Mandatory=$true)]
        [System.IO.FileInfo[]]$File,
        [parameter(Mandatory=$true)]
        [ValidateSet("Ticket","Agreement","Company","Configuration","Contact","Expense","Opportunity","PurchaseOrder","Project","SalesOrder","ServiceTemplate","Rma")]
        [String]$RecordType,
        [parameter(Mandatory=$true)]
        [Int]$RecordId,
        [parameter(Mandatory=$true)]
        [String]$Title,
        [parameter(Mandatory=$false)]
        [Boolean]$PrivateFlag=$false,
        [parameter(Mandatory=$false)]
        [Boolean]$ReadOnlyFlag=$false,
        [parameter(Mandatory=$false)]
        [Boolean]$IsAvatar=$false
    )
    
    process {
        $FileBin = [System.IO.File]::ReadAllBytes( $File.FullName )
        $Enc = [System.Text.Encoding]::GetEncoding("iso-8859-1")
        $FileEnc = $Enc.GetString( $FileBin )
        $FileName = $File.Name

        $Boundary = [System.Guid]::NewGuid().ToString()    

        $LF = "`r`n"
        $BodyLines = (
            "--$Boundary",
            "Content-Disposition: form-data; name=`"File`"; filename=`"$FileName`"$LF",
            $FileEnc,
            "--$Boundary",
            "Content-Disposition: form-data; name=`"RecordType`"$LF",
            $RecordType,
            "--$Boundary",
            "Content-Disposition: form-data; name=`"RecordId`"$LF",
            $RecordId,
            "--$Boundary",
            "Content-Disposition: form-data; name=`"Title`"$LF",
            $Title,
            "--$Boundary",
            "Content-Disposition: form-data; name=`"PrivateFlag`"$LF",
            $PrivateFlag,
            "--$Boundary",
            "Content-Disposition: form-data; name=`"ReadOnlyFlag`"$LF",
            $ReadOnlyFlag,
            "--$Boundary",
            "Content-Disposition: form-data; name=`"IsAvatar`"$LF",
            $IsAvatar,
            "--$Boundary--$LF"
        ) -join $LF

        $params = @{
            Uri         =    "https://" + $Script:cwmApiUri + "/system/documents"
            Method      =    "post"
            ContentType    =     "multipart/form-data; Boundary=`"$Boundary`""
            Headers     =    @{
                'Authorization'    = $Script:cwmApiAuthString
                'clientId' = $Script:cwmApiClientId
                'Accept' = "application/vnd.connectwise.com+json; version=$Script:cwmApiVersionCode"
            }
            Body        = $BodyLines
        }

        $Result = Invoke-RestMethod @Params
        Return $Result
    }
}