上传前获取项目并设置内容类型

时间:2018-12-19 07:31:12

标签: powershell powershell-v5.0 powershell-v6.0

我一直在尝试在PowerShell中构建一些代码(PowerShell 6 Core可以工作,以下代码在PowerShell 5中不起作用)

$Token = ' Token Here ';

$Headers = @{
    Method = 'POST'
    Uri = ' URL Here '
    Headers = @{Authorization = "Bearer $Token" }
}

$bodyHere = @{
    roomId = ' ChatSpace ID Here '
    text = ' Some Random Text '
    files = Get-Item -Path 'c:\test.png'
}

try {
    Invoke-RestMethod @Headers -Form $bodyHere
} catch [System.Net.WebException] {
    Write-Error $_.Exception.ToString()
    throw $_
}

这很好用,可以上传文件,但是我还需要在我的Content-Type: "image/png"项目中添加Get-Item-有一种简单的方法吗?

我还试图通过构建一个多部分表单来尝试另一种方式,我见过别人在StackOverflow上使用它,但是现在又遇到了另一个问题,当我尝试使用{时,我无法添加到多部分表单中{1}}或使用任何其他方法将其追加到表单。

Add-Member

任何有关如何使用文件上传和其他参数来构建多部分表单或将内容类型附加到Get-Item调用的帮助,将倍受赞赏。只是让您了解Python中代码的外观(容易得多):

$Token = ' Token Here ';

$Headers = @{
    Method = 'POST'
    Uri = ' URL Here '
    Headers = @{Authorization = "Bearer $Token" }
}

$bodyLines = @{
    roomId = ' ChatSpace ID Here '
    text =  ' Random Text here '
}

$FilePath = 'c:\test.png'
$FieldName = 'files'
$ContentType = 'image/png'

$FileStream = [System.IO.FileStream]::New($filePath, [System.IO.FileMode]::Open)
$FileHeader = [System.Net.Http.Headers.ContentDispositionHeaderValue]::New('form-data')
$FileHeader.Name = $FieldName
$FileHeader.FileName = Split-Path -Leaf $FilePath
$FileContent = [System.Net.Http.StreamContent]::New($FileStream)
$FileContent.Headers.ContentDisposition = $FileHeader
$FileContent.Headers.ContentType = [System.Net.Http.Headers.MediaTypeHeaderValue]::Parse($ContentType)

$MultipartContent = [System.Net.Http.MultipartFormDataContent]::New()
$MultipartContent.Add($FileContent)
$MultipartContent.Add($bodyLines) # this doesn't work as I'm building a multipart form

$MultipartContent | Add-Member -Name "headers" -Value $bodyLines -MemberType NoteProperty # I convert this to JSON and use write-host but it doesn't append I've also tried $MultipartContent.headers and it still doesn't append

try {
#    Invoke-RestMethod @Headers -Body $MultipartContent
    Invoke-WebRequest @Headers -Body $bodyLines
} catch [System.Net.WebException] {
    Write-Error $_.Exception.ToString()
    throw $_
}

1 个答案:

答案 0 :(得分:0)

我认为您想要文件的内容而不是文件信息。在脚本中尝试files = (Get-Content 'c:\test.png')之类的内容。如果您只想要文件的路径,则根本不需要使用Get-Item。

如果要上载.PNG文件,则如果字节中包含使输入的服务器端分析无效的控制字符,则此方法可能无效。