使用InvokeWebRequest发布多部分表单会生成内容类型异常



我正在尝试创建一个函数来使用多部分表单上传数据。

通常情况下,我会使用Form参数,但.Net在文件名中有一个问题,其中包含双关键标记(例如résumé.pdf(。

因此,我正在建立自己的。我使用Bamboo HR的上传员工文件方法作为帖子中需要包含的内容的指南。

功能:

$GUID = (New-Guid).Guid
$boundary = "------$GUID----"
# I've tried this w/ and w/o the `"` around the boundary text
$ContentType = "multipart/form-data; boundary=`"$boundary`""
$Item = Get-Item -Path $Path
$Headers['Content-Length'] = $Item.Length
$Parts = @()
$Parts += 
"Content-Disposition: form-data; name=`"fileName`"
{0}
" -f $Item.Name
$fileBytes = [System.IO.File]::ReadAllBytes($Path);
$fileEncoded = [System.Text.Encoding]::GetEncoding('UTF-8').GetString($fileBytes);
$Parts += 
"Content-Disposition: form-data; name=`"file`"; filename=`"{0}`"
Content-Type: application/octet-stream
{1}
" -f $Item.Name, $fileEncoded
$Parts += 
"Content-Disposition: form-data; name=`"share`"
{0}
" -f ( $Share ? 'yes' : 'no' )
$Parts += 
"Content-Disposition: form-data; name=`"category`"
{0}
" -f $CategoryId
$LF = "`r`n";
$Body += "$boundary$LF"
$Body += $Parts -join "$boundary$LF"
$Body += "$boundary$LF"
Invoke-WebRequest -Uri $Uri -Method Post -Body $Body -Headers $Headers -ContentType $ContentType

当函数运行时,Invoke-WebRequest返回此错误:

cmdlet无法运行,因为-ContentType参数不是有效的Content-Type标头。请为-ContentType指定一个有效的内容类型,然后重试。要取消标头验证,请提供-SkipHeaderValidation参数。

我添加了SkipHeaderValidation,但没有成功。

使用名为LoremIpsum.rtf的文件运行时,包含以下内容:

Lorem ipsum

内容类型:

multipart/form-data; boundary="------ea1b6b8d-1399-4d1e-be72-8cafa00434d1----"

正文:

------ea1b6b8d-1399-4d1e-be72-8cafa00434d1----
Content-Disposition: form-data; name="fileName"
LoremIpsum.rtf
------ea1b6b8d-1399-4d1e-be72-8cafa00434d1----
Content-Disposition: form-data; name="file"; filename="LoremIpsum.rtf"
Content-Type: application/octet-stream
{rtf1ansiansicpg1252cocoartf2580
cocoatextscaling0cocoaplatform0{fonttblf0fswissfcharset0 Helvetica;}
{colortbl;red255green255blue255;}
{*expandedcolortbl;;}
margl1440margr1440vieww11520viewh8400viewkind0
pardtx720tx1440tx2160tx2880tx3600tx4320tx5040tx5760tx6480tx7200tx7920tx8640pardirnaturalpartightenfactor0
f0fs24 cf0 Lorem ipsum
}
------ea1b6b8d-1399-4d1e-be72-8cafa00434d1----
Content-Disposition: form-data; name="share"
yes
------ea1b6b8d-1399-4d1e-be72-8cafa00434d1----
Content-Disposition: form-data; name="category"
22
------ea1b6b8d-1399-4d1e-be72-8cafa00434d1----

这只是我如何指定Content-Type标头的问题还是其他问题?

这是我的工作代码。

$uri = "https://api.bamboohr.com/api/gateway.php/{0}/v1/employees/{1}/files" -f $company, $employeeID
$pdf = Get-Item $filepath
$fileName = $pdf.Name
$fileBytes = [System.IO.File]::ReadAllBytes($pdf);
$fileiso = [System.Text.Encoding]::GetEncoding('iso-8859-1').GetString($fileBytes);
$boundary = [System.Guid]::NewGuid().ToString()
$LF = "`n"
$bodyLines = (
"--$boundary",
'Content-Disposition: form-data; name="category"',
'',
"$category",
"--$boundary",
'Content-Disposition: form-data; name="fileName"',
'',
"$($fileName)",
"--$boundary",
'Content-Disposition: form-data; name="share"',
'',
"yes",
"--$boundary",
"Content-Disposition: form-data; name='file'; filename=$($fileName)",
'Content-Type: application/pdf',
'',
"$fileiso",
"--$boundary"
) -join $LF
$result = Invoke-WebRequest -Uri $uri -Credential $credential -Method Post -ContentType "multipart/form-data; boundary=$boundary" -UseBasicParsing -Body $bodyLines

最新更新