将 Python HTTP POST 转换为 Powershell:如何发送混合数据?

Converting a Python HTTP POST to Powershell: how do I send mixed data?

我有一个 Python 脚本,我正在尝试将其转换为 Powershell。该脚本将文件上传到 Amazon S3。除了文件,它还必须发送一些数据(request_attibutes 字典)。此数据是从之前的请求中填充的,我这里有一些占位符数据。

request_attibutes = {
    'AWSAccessKeyId': 'ID',
    'key': 'ldskfjhasdf',
    'x-amz-security-token': 'adsfsdfjkl',
    'policy': 'akjsdfh',
    'signature': 'askjdhf'}

http_response = requests.post(url, data=request_attibutes, files=files)

转换为 Powershell:

$request_attibutes = @{AWSAccessKeyId=$keyid; key=$document_upload_data.key; 'x-amz-security-token'= $document_upload_data.'x-amz-security-token'; policy= $document_upload_data.policy;signature= $document_upload_data.signature}
$cf=Get-Item -Path $contentfile

我正在使用数组将 $request_attibutes 和文件打包成一个项目。

$ra=@($request_attibutes2,$cf)

$response2 = Invoke-WebRequest -Uri $uploadurl -Method Post -Body $ra

服务器响应 (412) 先决条件失败。 所以有些东西是服务器不期望的。但是什么?

我最终手动构建了请求正文:

$boundary = [System.Guid]::NewGuid().ToString();
$LF = "`r`n";
$bodyLines = (
    "--$boundary",
    "Content-Disposition: form-data; name=`"key`";",
  "Content-Type: text$LF",
    "$contentuploadpath",
    "--$boundary",
    "Content-Disposition: form-data; name=`"AWSAccessKeyId`";",
  "Content-Type: text$LF",
    $document_upload_data.awsaccesskeyid,
    "--$boundary",
    "Content-Disposition: form-data; name=`"policy`";",
  "Content-Type: text$LF",
    $document_upload_data.policy,
    "--$boundary",
    "Content-Disposition: form-data; name=`"signature`";",
  "Content-Type: text$LF",
    $document_upload_data.signature,
    "--$boundary",
    "Content-Disposition: form-data; name=`"x-amz-security-token`";",
  "Content-Type: text$LF",
    $document_upload_data.'x-amz-security-token',
    "--$boundary",
    "Content-Disposition: form-data; name=`"file`";     filename=`"$contentfilename`"",
  "Content-Type: application/octet-stream$LF",
    $fileEnc,
    "--$boundary--$LF"
 ) -join $LF

这导致输出看起来与我试图复制的 Python 脚本相同,但我在上传时仍然遇到服务器错误。

所以我从 Invoke-WebRequest 切换到 Invoke-RestMethod:

Invoke-RestMethod -Uri $uploadurl -Method Post -ContentType "multipart/form-data; boundary=`"$boundary`"" -Body $bodyLines

现在可以使用了,不幸的是 PS 5 Invoke-RestMethod 没有 return 服务器响应,所以我正在盲目上传。在服务器上我们可以看到数据进来了。