将 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 服务器响应,所以我正在盲目上传。在服务器上我们可以看到数据进来了。
我有一个 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 服务器响应,所以我正在盲目上传。在服务器上我们可以看到数据进来了。