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?
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() } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With