Как скачать zip-файл с помощью PowerShell из потока запросов - PullRequest
0 голосов
/ 10 января 2020

В настоящее время я делаю POST-запрос к внешнему веб-сайту, затем я должен получить zip-файл взамен. Я могу получить zip-файл, но он входит в xml только с именем .zip и ничего не загружается. Я понятия не имею, почему он не загружается. Мой код ниже на той части, где я делаю фактический запрос. Я не уверен, что переусердствую в разработке или в том, что еще мне нужно сделать, чтобы получить актуальный файл для загрузки.

$url = "https://thewebsite.net/v6_1?id=$messageID"
Write-Output($url)
$Body = [byte[]][char[]]$xmlMessage
Write-Output($Body)
$Request = [System.Net.HttpWebRequest]::CreateHttp($url);
$Request.Method="POST"
$Request.ContentType = 'text/xml;charset=utf-8'
$Request.ContentLength = $Body.Length
$Request.ClientCertificates.Add($Certificate)
Write-Output($Request.ClientCertificates)
$Stream = $Request.GetRequestStream();
$Stream.Write($Body, 0, $Body.Length);
$Response = $Request.GetResponse()
$totalLength = [System.Math]::Floor($Response.get_ContentLength()/1024)
$responseStream = $Response.GetResponseStream()
$targetStream = New-Object -TypeName System.IO.FileStream -ArgumentList "D:\path\to\save\test.txt", Create
$buffer = new-object byte[] 1GB
$count = $responseStream.Read($buffer,0,$buffer.length)
$downloadedBytes = $count
while ($count -gt 0)
    {

        [System.Console]::CursorLeft = 0
        [System.Console]::Write("Downloaded {0}K of {1}K", [System.Math]::Floor($downloadedBytes/1024), $totalLength)
        $targetStream.Write($buffer, 0, $count)
        $count = $responseStream.Read($buffer,0,$buffer.length)
        $downloadedBytes = $downloadedBytes + $count
    Write-Output($count)
    }
    $targetStream.Flush()
    $targetStream.Close()
    $targetStream.Dispose()
    $responseStream.Dispose()

Ответы [ 2 ]

0 голосов
/ 11 января 2020

Вы пытались использовать Invoke-WebRequest?

$path = [Environment]::GetFolderPath("MyDocuments")
Invoke-WebRequest "example.com" -OutFile "$path\ZippedFile.zip"

Переменная не должна использоваться, поскольку при желании путь может быть полностью определен в строке Invoke-WebRequest.

0 голосов
/ 11 января 2020

К сожалению, без определенного URI загрузки трудно уточнить, что ваш случай нетривиален или вы просто выбираете неоптимальный способ получить удаленный файл. Обычный способ получить «.zip» (или любой другой файл «octet / stream») с помощью Power-Shell - выполнить следующую команду

Invoke-WebRequest -uri "https://thewebsite.net/v6_1?id=$messageID" -Method "GET"  -Outfile (-join($messageID,".zip"))  

, после чего будет создан файл $ messageID.zip в каталоге, из которого Вы выполняете Power-Shell Progress будет отображаться в окне консоли автоматически. Я тестирую этот пример непосредственно перед тем, как написать ответ, и он работает независимо от метода «POST» / «GET», когда удаленный хост фактически возвращает «octet / stream» в ответе. Возможно, в вашем случае файл не возвращается напрямую после запроса

thewebsite.net / v6_1? Id = $ messageID

, но это не точка вашего первоначального вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...