Upload multiple files from Powershell script

后端 未结 4 1354
悲哀的现实
悲哀的现实 2020-12-01 11:17

I have a webapplication that can process POSTing of a html form like this:

4条回答
  •  生来不讨喜
    2020-12-01 11:48

    I was bothered by this thing and haven't found a satisfactory solution. Although the gist here proposed can do the yob, it is not efficient in case of large files transmittal. I wrote a blog post proposing a solution for it, basing my cmdlet on HttpClient class present in .NET 4.5. If that is not a problem for you, you can check my solution at the following address http://blog.majcica.com/2016/01/13/powershell-tips-and-tricks-multipartform-data-requests/

    EDIT:

    function Invoke-MultipartFormDataUpload
    {
        [CmdletBinding()]
        PARAM
        (
            [string][parameter(Mandatory = $true)][ValidateNotNullOrEmpty()]$InFile,
            [string]$ContentType,
            [Uri][parameter(Mandatory = $true)][ValidateNotNullOrEmpty()]$Uri,
            [System.Management.Automation.PSCredential]$Credential
        )
        BEGIN
        {
            if (-not (Test-Path $InFile))
            {
                $errorMessage = ("File {0} missing or unable to read." -f $InFile)
                $exception =  New-Object System.Exception $errorMessage
                $errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, 'MultipartFormDataUpload', ([System.Management.Automation.ErrorCategory]::InvalidArgument), $InFile
                $PSCmdlet.ThrowTerminatingError($errorRecord)
            }
    
            if (-not $ContentType)
            {
                Add-Type -AssemblyName System.Web
    
                $mimeType = [System.Web.MimeMapping]::GetMimeMapping($InFile)
    
                if ($mimeType)
                {
                    $ContentType = $mimeType
                }
                else
                {
                    $ContentType = "application/octet-stream"
                }
            }
        }
        PROCESS
        {
            Add-Type -AssemblyName System.Net.Http
    
            $httpClientHandler = New-Object System.Net.Http.HttpClientHandler
    
            if ($Credential)
            {
                $networkCredential = New-Object System.Net.NetworkCredential @($Credential.UserName, $Credential.Password)
                $httpClientHandler.Credentials = $networkCredential
            }
    
            $httpClient = New-Object System.Net.Http.Httpclient $httpClientHandler
    
            $packageFileStream = New-Object System.IO.FileStream @($InFile, [System.IO.FileMode]::Open)
    
            $contentDispositionHeaderValue = New-Object System.Net.Http.Headers.ContentDispositionHeaderValue "form-data"
            $contentDispositionHeaderValue.Name = "fileData"
            $contentDispositionHeaderValue.FileName = (Split-Path $InFile -leaf)
    
            $streamContent = New-Object System.Net.Http.StreamContent $packageFileStream
            $streamContent.Headers.ContentDisposition = $contentDispositionHeaderValue
            $streamContent.Headers.ContentType = New-Object System.Net.Http.Headers.MediaTypeHeaderValue $ContentType
    
            $content = New-Object System.Net.Http.MultipartFormDataContent
            $content.Add($streamContent)
    
            try
            {
                $response = $httpClient.PostAsync($Uri, $content).Result
    
                if (!$response.IsSuccessStatusCode)
                {
                    $responseBody = $response.Content.ReadAsStringAsync().Result
                    $errorMessage = "Status code {0}. Reason {1}. Server reported the following message: {2}." -f $response.StatusCode, $response.ReasonPhrase, $responseBody
    
                    throw [System.Net.Http.HttpRequestException] $errorMessage
                }
    
                $responseBody = [xml]$response.Content.ReadAsStringAsync().Result
    
                return $responseBody
            }
            catch [Exception]
            {
                $PSCmdlet.ThrowTerminatingError($_)
            }
            finally
            {
                if($null -ne $httpClient)
                {
                    $httpClient.Dispose()
                }
    
                if($null -ne $response)
                {
                    $response.Dispose()
                }
            }
        }
        END { }
    }
    

    Cheers

提交回复
热议问题