Public/New-TemporaryFileForBinaryUpload.ps1

function New-TemporaryFileForBinaryUpload {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [System.IO.FileInfo] $File,
        [String] $Name = "file"
    )

    $Boundary = "----WebKitFormBoundary" + [System.Guid]::NewGuid().ToString("N")
    $UTF8NoBOM = New-Object "System.Text.UTF8Encoding" -ArgumentList @($false)
    $TemporaryFile = New-TemporaryFile

    $FileStream = New-Object System.IO.FileStream($TemporaryFile, [System.IO.FileMode]::Append)
    $BinaryWriter = New-Object System.IO.BinaryWriter($FileStream)

    $BinaryWriter.Write($UTF8NoBOM.GetBytes("--$($Boundary)`r`n"))
    $BinaryWriter.Write($UTF8NoBOM.GetBytes("Content-Disposition: form-data; name=`"$($Name)`"; filename=`"$($File.Name)`"`r`n"))
    $BinaryWriter.Write($UTF8NoBOM.GetBytes("Content-Type: application/octet-stream`r`n`r`n"))
    $BinaryWriter.Write([System.IO.File]::ReadAllBytes($File.FullName))
    $BinaryWriter.Write($UTF8NoBOM.GetBytes("`r`n--$($Boundary)--`r`n"))
    $BinaryWriter.Close()

    $ContentType = "multipart/form-data; boundary=$($Boundary)"

    return @{
        TemporaryFile = $TemporaryFile
        ContentType = $ContentType
    }
}