3

我正在使用 Invoke-Restmethod 尝试将 png 文件上传到 rapidshare,服务器上的文件大小是正确的,但如果我下载文件,它甚至不是图像,这绝对是一个编码问题,但我不知道我是什么做错了吗?

$FreeUploadServer = Invoke-RestMethod -Uri "http://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=nextuploadserver"
$url = "http://rs$FreeUploadServer.rapidshare.com/cgi-bin/rsapi.cgi"
$fields = @{sub='upload';login='username';password='pass';filename='2he1re.png';filecontent=$(Get-Content C:\libs\test.png -Raw)}

Invoke-RestMethod -Uri $url -Body $fields -Method Post -ContentType "image/png"

我已经尝试了各种各样的东西,有人知道我做错了什么吗?

4

1 回答 1

2

使用参数读取文件内容-Raw仍然返回一个string对象,这对于像 PNG 这样的二进制文件可能会有问题。我认为 RapidShare API 需要 URL 编码的表单发布数据。尝试这个:

## !! It would be nice if this worked, but it does not - see update below !!
Add-Type -AssemblyName System.Web
$fields = @{sub='upload';login='username';password='pass';filename='2he1re.png';
            filecontent=Get-Content C:\libs\test.png -Enc Byte -Raw}

顺便说一句,我认为您可能想放弃设置ContentType. 内容类型应该是application/x-www-form-urlencoded- 我认为。

我发现这篇文章对 HtmlEncode 和 UrlEncode 之间的区别很有用。

更新:当正文采用哈希表的形式时,似乎Invoke-RestMethod是 URL 编码 POST 的正文。那很好。但是它似乎不接受字节数组。它期望哈希表中的每个值都是一个字符串或可表示为一个字符串,即它对每个值调用 ToString()。这使得正确编码二进制数据变得具有挑战性。我对 PowerShell 团队有疑问。

好的,想出了一个合理的解决方法。还记得我之前提到的,将 Body 作为字符串传递等同于传递哈希表吗?好吧,事实证明有一个重要的区别。:-) 当您传入一个字符串时,cmdlet 不会对其进行 Url 编码。因此,如果我们传入一个字符串,我们可以绕过我认为是此 cmdlet 的限制(不支持哈希表中的 byte[] 值)。尝试这个:

Add-Type -AssemblyName System.Web
$png  = [Web.HttpUtility]::UrlEncode((Get-Content C:\libs\test.png -Enc Byte -Raw))
$body = "sub=upload&login=username&password=pass&filename=2he1re.png&filecontent=$png"
Invoke-RestMethod -Uri $url -Body $body -Method Post
于 2012-09-04T20:53:07.510 回答