我正在尝试将标准的curl请求转换为可以在powershell脚本中运行的东西。
这是持续有效的卷曲:
curl -X POST -F "file=@C:\your\file\location\Example.csv" -H "Authorization: Bearer [INSERT BEARER TOKEN]" https://example-api-or-endpoint.com
这是始终失败的 powershell:
$uri = "https://example-api-or-endpoint.com" $outputCsvPath = "C:\your\file\location\Example.csv" $headers = @{"Authorization" = "Bearer [BEARERTOKEN]"} Invoke-WebRequest -Uri $uri -Method Post -InFile $outputCsvPath -ContentType "multipart/form-data" -Headers $headers
预期结果:
{"file_id":"FILEID","message":"File sent successfully","status":"success"}
实际结果:
{"message":"No file part in the request","status":"error"}
我尝试使用 RestMethod,将 InFile 更改为 Body,确保文件路径正确并且文件存在,但我不断收到错误消息,指出请求中没有文件部分。
值得一提的是,我使用的 URL 是 Google Cloud Function 端点,因此不完全是一个 API,但我在详细信息中提到的 CURL 语句在 100% 的情况下有效,但它的 powershell 版本在 100% 的情况下失败.
对于一些其他上下文,POST 请求应该发送整个文件,而不是其内容。
multipart/form-data
提交,将 hashtable 传递给 -Form
参数,其条目的值为 [System.IO.FileInfo]
实例(通过 获取) Get-Item
,例如:
因此:
$uri = "https://example-api-or-endpoint.com"
$outputCsvPath = "C:\your\file\location\Example.csv"
$headers = @{ "Authorization" = "Bearer [BEARERTOKEN]" }
# Use the -Form parameter with a hashtable and add an entry that
# references the file to upload via Get-Item
Invoke-WebRequest -Uri $uri -Method Post -Headers $headers -Form @{
file = Get-Item -LiteralPath C:\your\file\location\Example.csv
}
注:
通过这种简化的方法,您无法控制正在上传的文件的媒体类型;总是使用通用的
application/octet-stream
。
如果您需要更多控制,请参阅示例 5