Get-Item и настройка Content-Type перед загрузкой - PullRequest
0 голосов
/ 19 декабря 2018

Я пытался создать некоторый код в 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, но теперь у меня возникает другая проблема, когда я не могу добавить в составную форму, когда пытаюсь использовать Add-Member или использовать любой другой метод для добавления в форму.

$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 $_
}

Любая помощь в том, как создать многокомпонентную форму с загрузкой файла и другими параметрами, или в привязке типа контента к вызову Get-Item, будет очень признательна.Просто чтобы дать вам представление о том, как выглядит код в Python (гораздо проще):

import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder

m = MultipartEncoder({'roomId': ' ChatSpace ID Here ',
                      'text': ' Random Text Here ',
                      'files': ('example.png', open('example.png', 'rb'),
                      'image/png')})

r = requests.post(' URL Here ', data=m,
                  headers={'Authorization': 'Bearer TokenHere',
                  'Content-Type': m.content_type})

print r.text

1 Ответ

0 голосов
/ 19 декабря 2018

Я думаю, что вы хотите содержимое файла вместо информации о файле.Попробуйте что-то вроде files = (Get-Content 'c:\test.png') в вашем скрипте.Если вам просто нужен путь к файлу, вам вообще не нужно использовать Get-Item.

Если вы загружаете файл .PNG, это может не сработать, если в байтах содержатся управляющие символы, которые обманывают серверную сторону.парсинг ввода.

...