通过Powershell将文件上传到HTTP

10
我们有一个上传图片到服务器的PHP网站,上传的是简单的JPG文件并且命名正确。问题在于有时我们需要一次上传几百个图片,但PHP只接受一个文件,然后重命名并上传。我在PS中完成了文件操作,但上传失败。
就上传相关的PHP部分(据我所知)看起来像这样:<form name='' id='' enctype='multipart/form-data' method='POST' action='/picture_upload.php' target='_self' onsubmit="default_on_submit(event)"> 我在Google上查找相关主题,并在此处得到以下内容:
$uri = "http://example.com/"
$pwd = ConvertTo-SecureString 'MyPassword' -AsPlainText -Force
$cred = New-Object Management.Automation.PSCredential ('myuser', $pwd)
$contentType = "multipart/form-data"
    $body = @{
        "FileName" = Get-Content($uploadPath) -Raw
    }
    Invoke-WebRequest -Uri $uri -Method Post -ContentType $contentType -Body $body

我已经检查过$uploadPath,它是正确的C:\Folder\file.jpg。我使用我登录到站点的凭据,在GUI上传这些图片。

我尝试在POST和PUT之间切换,但没有改变。

http://example.com替换为http://example.com/file.jpg也没有任何区别。不确定使用POST的正确方式。

我们公司有McAffe Web网关,但我正在使用可以绕过它的用户运行脚本,所以这不是导致问题的原因。

当前收到的错误消息是:"Invoke-WebRequest:底层连接被关闭:接收时发生了意外错误。"

非常感谢任何帮助!如果这个问题已经得到解决而我只是错过了一个条目,请原谅!

P.S. 我也尝试了这个 - Powershell脚本将本地系统的日志文件上传到http URL,它返回Exception calling "UploadFile" with "3" argument(s): "An exception occurred during a WebClient request."


PS2.0中的解决方案是什么?我发现Invoke-WebRequest在PS2.0中不受支持。 - thisisdude
2个回答

25

可能已经晚了一年,所以您可能不再需要答案了,但对我有效的是:

Invoke-RestMethod -Uri $uri -Method Post -InFile $uploadPath -UseDefaultCredentials

我需要使用Windows身份验证,作为当前登录的用户...从另一个答案中看起来,有些情况下可以使用-cred,在其他情况下则必须构建授权标头。


你好!我遇到了同样的问题,正在尝试使用你的解决方案。我确实可以使用这个命令将一些字节发送到我的服务器,但我很难将这些字节转换成文件。有什么建议或建议吗?提前感谢。 - May.D
编辑:明白了,只需要编写字节并以适当的格式保存。 - May.D
1
嗨。在另一端使用nodejs和express时,我遇到了使用此内容的困难。有什么提示可以帮助我取出文件吗?我也不知道该搜索什么来获取帮助。谢谢,J。 - Jarrod McGuire
我可以将文件放入一个变量中,就像curl -X POST http://10.0.2.2:8081/upload -F 'files=@/path/to/file'那样吗? - undefined

5

虽然这是个晚一点的帖子,但是这些Invoke-RestMethod的解决方案(还有其他一些)对我没有起作用。我的服务端点由于缺少边界和其他“内容”问题而失败,具体情况取决于我的尝试和错误。

我尝试使用WebClient的Uploadfile()功能,它对我来说工作得很好。谢天谢地,它非常简洁明了。

$wc = New-Object System.Net.WebClient
$resp = $wc.UploadFile($uri,$uploadPath)

1
不幸的是,我已经不在那里工作了,也无法访问系统,因此无法检查这是否有效。不管怎样,这看起来是一个不错的解决方案,希望能帮助未来遇到类似问题的人! - Kārlis Bergmanis
1
@user01CU812- 你的答案对我很有用。文件已成功上传。建议-只需添加以字符串形式显示响应: [System.Text.Encoding]::ASCII.GetString($resp) - Prodip
这对我有用,因为我需要尽可能接近 FormData 文件上传的东西。 - thepenguinmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接