.net 上载已损坏,但文件大小正确吗?

.net 上载已损坏,但文件大小正确吗?,.net,powershell,png,.net,Powershell,Png,我正在使用Invoke Restmethod尝试将png文件上载到rapidshare,服务器上的文件大小是正确的,但如果我下载的文件甚至不是图像,这肯定是编码问题,但我不知道我做错了什么 $FreeUploadServer = Invoke-RestMethod -Uri "http://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=nextuploadserver" $url = "http://rs$FreeUploadServer.rapidshare

我正在使用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
参数读取文件内容仍然返回
字符串
对象,对于PNG这样的二进制文件,这可能会有问题。我认为RapidShareAPI需要URL编码的表单post数据。试试这个:

$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"
## !! 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}
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
顺便说一句,我想你可能想放弃设置
ContentType
。内容类型应该是
application/x-www-form-urlencoded
——我想

我发现HtmlEncode和UrlEncode之间的区别很有用

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

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

## !! 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}
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

感谢Keith,稍后将对此进行尝试,这是仅针对此cmdlet还是哈希表通常不支持字节数组?这只是针对传递给Invoke-RestMethod cmdlet的Body参数的哈希表。先生,您是个天才:D它起作用了!谢谢还有,他们为什么要在正文中使用哈希表呢?有什么原因吗,我对powershell比较陌生,我正在尽可能多地学习呢?我认为这很有效:(Keith,你知道为什么这只适用于小文件吗?如果我尝试上传一个大于1MB的文件,它会出错,我与某人交谈,他们说URL可能太长,有什么想法吗?URL编码数据的最大大小将由RapidShare的web服务器控制。显然,在128KB到2GB之间。对于大文件,你可以您必须使用RapidShare的sub=uploadresume功能—将文件分块。