Upload GROßER Dateien über HTTP
Ich versuche zum hochladen von wirklich großen VM-Images (5-15 Gb Größe) an einen HTTP-server mit PowerShell.
Habe ich versucht zu verwenden, dass für einige Methoden (hier links zu Skript mit net.WebClient.UploadFile und Skript mit " Invoke-webRequest)
Es gut funktioniert für Dateien kleiner als 2 GB sind, nicht jedoch für Dateien, die größer als dieser.
Ich versuche, die Arbeit mit httpWebRequest direkt, aber ich nicht in der Lage zu setzen FileStream
hinein.
Also meine Frage ist: wie filestream in webrequest?
Oder allgemeiner: wie zum hochladen von großen Dateien über http mit PowerShell?
$Timeout=10000000;
$fileName = "0.iso";
$data = "C:\\$fileName";
$url = "http://nexus.lab.local:8081/nexus/content/sites/myproj/$fileName";
#$buffer = [System.IO.File]::Open("$data",[System.IO.Filemode]::Open, [System.IO.FileAccess]::Read) #Err Cannot convert argument "buffer", with value: "System.IO.FileStream", for "Write" to type "System.Byte[]":
#$buffer = gc -en byte $data # too much space in memory
$buffer = [System.IO.File]::ReadAllBytes($data) #Limit 2gb
[System.Net.HttpWebRequest] $webRequest = [System.Net.WebRequest]::Create($url)
$webRequest.Timeout = $timeout
$webRequest.Method = "POST"
$webRequest.ContentType = "application/data"
#$webRequest.ContentLength = $buffer.Length;
$webRequest.Credentials = New-Object System.Net.NetworkCredential("admin", "admin123");
$requestStream = $webRequest.GetRequestStream()
$requestStream.Write($buffer, 0, $buffer.Length)
$requestStream.Flush()
$requestStream.Close()
[System.Net.HttpWebResponse] $webResponse = $webRequest.GetResponse()
$streamReader = New-Object System.IO.StreamReader($webResponse.GetResponseStream())
$result = $streamReader.ReadToEnd()
return $result
$stream.Close()
- Sind Sie sicher, dass das nicht eine Einschränkung der server, die Sie hochladen zu? Gibt es eine maximale POST-Größe einstellen?
- dieser Befehl von linux-box funktioniert gut und einfach hochladen von großen Dateien:
curl -v -u admin:admin123 --upload-file file.iso http://nexus.ndlab.local:8081/nexus/content/sites/myproj/fromlinux.iso
Du musst angemeldet sein, um einen Kommentar abzugeben.
Standardmäßig HttpWebRequest ist die Pufferung von Daten im Speicher.
Setzen Sie einfach HttpWebRequest.AllowWriteStreamBuffering-Eigenschaft auf false, und Sie wäre in der Lage, das hochladen von Dateien mit nahezu beliebiger Größe.
Weitere Einzelheiten finden Sie unter msdn
Danke @Stoune, es war die Letzte Sache, die geholfen empfangen Sie schließlich funktionierende Lösung.
Einer mehr, es ist notwendig, sich zu organisieren stream-Datei Lesen und schreiben, um die webrequest-Puffer. Und es möglicherweise zu tun mit diesem Stück code:
Und endgültige Skript wie folgt Aussehen:
Beim hochladen von Sonatype Nexus3 ich verwendete den folgenden code ein. Hat mich einige Zeit, um es herauszufinden, arbeiten mit hoch-und response von Nexus3 und das hochladen und herunterladen von großen Dateien (größer als 2GB). Wir haben Apache vor Nexus3 kümmert sich um die https-verbindungen.
Die Verwendung der basic-Authentifizierung sicher, dass die Nexus reagiert hat Recht, wenn Apache davor.
Senden pre-Authentifizierung über KOPF und mit chunked upload für große Dateien fest, dass das hochladen von großen Dateien nicht vorzeitig beendet wird.
Herunterladen großer Dateien über Invoke-WebRequest würde scheitern, auch mit unterschiedlichen Fehlern. Jetzt benutze ich
WebRequest
über .Net und es funktioniert, sieheDownload-File
.Und wenn der code ausgeführt wurde, über einen automatisierten Prozess (von System Center Orchestrator), https scheitern würden. So zwingen wir TLS 1.2 als Schema https erkannt wird.
$webRequest.UserAgent
zukünftige Nutzer.