Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to send multipart/form-data with PowerShell Invoke-RestMethod

Tags:

I'm trying to send a file via Invoke-RestMethod in a similar context as curl with the -F switch.

Curl Example

curl -F FileName=@"/path-to-file.name" "https://uri-to-post" 

In powershell, I've tried something like this:

$uri = "https://uri-to-post" $contentType = "multipart/form-data" $body = @{     "FileName" = Get-Content($filePath) -Raw }  Invoke-WebRequest -Uri $uri -Method Post -ContentType $contentType -Body $body } 

If I check fiddler I see that the body contains the raw binary data, but I get a 200 response back showing no payload has been sent.

I've also tried to use the -InFile parameter with no luck.

I've seen a number of examples using a .net class, but was trying to keep this simple with the newer Powershell 3 commands.

Does anyone have any guidance or experience making this work?

like image 713
Jeff Avatar asked Mar 18 '14 21:03

Jeff


1 Answers

The accepted answer won't do a multipart/form-data request, but rather a application/x-www-form-urlencoded request forcing the Content-Type header to a value that the body does not contain.

One way to send a multipart/form-data formatted request with PowerShell is:

$ErrorActionPreference = 'Stop'  $fieldName = 'file' $filePath = 'C:\Temp\test.pdf' $url = 'http://posttestserver.com/post.php'  Try {     Add-Type -AssemblyName 'System.Net.Http'      $client = New-Object System.Net.Http.HttpClient     $content = New-Object System.Net.Http.MultipartFormDataContent     $fileStream = [System.IO.File]::OpenRead($filePath)     $fileName = [System.IO.Path]::GetFileName($filePath)     $fileContent = New-Object System.Net.Http.StreamContent($fileStream)     $content.Add($fileContent, $fieldName, $fileName)      $result = $client.PostAsync($url, $content).Result     $result.EnsureSuccessStatusCode() } Catch {     Write-Error $_     exit 1 } Finally {     if ($client -ne $null) { $client.Dispose() }     if ($content -ne $null) { $content.Dispose() }     if ($fileStream -ne $null) { $fileStream.Dispose() }     if ($fileContent -ne $null) { $fileContent.Dispose() } } 
like image 130
David Avatar answered Oct 12 '22 03:10

David