我正在使用 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"
我已经尝试了各种方法,有人知道我做错了什么吗?
最佳答案
使用 -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
- 我认为。
我找到了 this post有助于了解 HtmlEncode 和 UrlEncode 之间的区别。
更新:当正文采用哈希表形式时,Invoke-RestMethod
似乎是为 POST 对正文进行 URL 编码。那很好。但是它似乎不接受字节数组。它期望哈希表中的每个值都是字符串或可表示为字符串,即它对每个值调用 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
关于.net - 上传损坏但文件大小正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12270983/