【问题标题】:How to use Invoke-RestMethod to upload jpg如何使用 Invoke-RestMethod 上传 jpg
【发布时间】:2019-02-16 02:15:00
【问题描述】:

我正在尝试使用 PowerShell commandlet Invoke-RestMethod 将图片发布到 url。这是我的命令:

$usercreds = Get-Credential
$pic = Get-Content \\server\share\pic.jpg
$uri = http://website/sub/destination

Invoke-RestMethod -uri $uri -Method Put -Body $pic -ContentType 'image/jpg' -Credential $usercreds

我收到一个错误: “该文件不是有效的图像文件。”我也尝试使用 Invoke-WebRequest,结果相同。 Web 服务器不是我们的,他们那边的技术人员说使用 curl,但我们不知道如何使用,也没有 Linux 机器。有什么我想念的吗?我可以毫无问题地打开 jpg,所以它没有损坏或任何东西。

我试过这个,但是服务器对我大喊:Using PowerShell Invoke-RestMethod to POST large binary multipart/form-data

错误代码:

PS C:\Windows\system32> Invoke-WebRequest -uri $uri -Method Put -Body $pic -ContentType 'image/jpg' -Credential $usercreds
Invoke-WebRequest : {"error":{"message":"the file is not a valid image file"},"data":[],"meta":"error"}
At line:1 char:1
+ Invoke-WebRequest -uri $uri -Method Put -Body $pic -ContentType 'imag ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

【问题讨论】:

  • 对我大喊大叫是什么意思。那怎么行不通? $pic 是一个换行符分隔的字符串数组,而不是图片所期望的。
  • 它告诉我:远程服务器返回一个错误:(405)方法不允许。我将图片的直接路径传递给它,这给了我同样的错误。
  • 您能确切地向我们展示一下您尝试了什么导致了该错误吗?我知道你在这里的代码不起作用。对于我们看不到的代码,我不知道该告诉你什么。
  • PS C:\Windows\system32> Invoke-RestMethod -uri $uri -Method Put -Body $pic -ContentType 'image/jpg' -Credential $usercreds Invoke-RestMethod : {"error": {"message":"该文件不是有效的图像文件"},"data":[],"meta":"error"} At line:1 char:1 + Invoke-RestMethod -uri $uri -Method Put -Body $pic -ContentType 'imag ... + + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
  • 谢谢。请edit将这些细节放入您的问题中。 cmets 中的代码很糟糕。

标签: powershell


【解决方案1】:

尝试使用-Infile 参数。 Get-Content 将你的文件解释为一个字符串数组,然后把事情搞砸了。

$usercreds = Get-Credential
$picPath = "\\server\share\pic.jpg"
$uri = http://website/sub/destination

Invoke-WebRequest -uri $uri -Method Put -Infile $picPath -ContentType 'image/jpg' -Credential $usercreds

【讨论】:

  • 如果这是真的并且确实有效,这应该是一个骗局。很高兴知道 OP 遇到了什么错误。
  • 他说“该文件不是有效的图像文件。”使用Get-Content 完全合乎逻辑
  • 他还说他试过你展示的方法,报错了。
  • 他可能使用了“Post”而不是“Put”,这解释了第二个错误消息。
  • @TToni 似乎有效。至少我现在犯了一个不同的错误。哈哈。谢谢您的帮助!当我之前尝试过时,我正在使用 Post。再次感谢!
【解决方案2】:

我已经尝试了一天来让它工作。我的设置是一个powershell脚本,它将屏幕截图推送到保存到服务器的nod​​ejs express api端点。上面的代码几乎可以工作,也就是说,端点被命中并保存了文件,但是保存的任何内容都不是正确的编码。我到处寻找解决方案,使用了多种框架,如 multer、formidable、busboy 等。尝试了各种方法,包括为多部分表单构建主体,但结果相同。

最终对我有用(以防其他人正在阅读)是将其作为 base64 数据发送并在另一端进行转换,因为编码不正确,我无法解决.

Powershell 脚本($path 和 $uri 同上,没什么区别)

$base64Image = [convert]::ToBase64String((get-content $path -encoding byte))
Invoke-WebRequest -uri $uri -Method Post -Body $base64Image -ContentType "application/base64"

Nodejs 快递


app.post("/api/screenshot/", (req,res) => {
    let body = '';
    req.on('data', chunk => {
        body += chunk.toString();
    });
    req.on('end', () => {
      fs.writeFile(__dirname + '/public/images/a.jpg', body,'base64',function(err) {
        if( err ) {
          res.end('not okay');
        } else {
          res.end('ok');
        }
      });
    });
});

可能效率更低,但我需要一些工作。

【讨论】:

  • 请注意:一旦我完成了上述工作,我会假设它也可以与任何中间件一起再次工作。我认为问题不在于请求解析,而在于 powershell 和 http 之间的旅程,但知识却让我无法理解。到目前为止,我的旅程是曲折的,除非迫不得已,否则我真的不会为更新而烦恼。
  • 感谢您的解决方案,(get-content $path -encoding byte) 非常慢。相反,我使用了 ([System.IO.File]::ReadAllBytes($ImagePath))。
猜你喜欢
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
相关资源
最近更新 更多