Ich versuche, Stapel von Dateien zusammen mit verschiedenen anderen Formularelementen über asynchrone XMLHTTPRequest zu senden. Jeder Stapel kann eine Dateigröße von bis zu 15 MB enthalten. Es kann mehrere Stapel geben.System.OutOfMemoryException wurde beim Konvertieren von Base64-Zeichenfolge in Byte-Array während der Verarbeitung mehrerer Dateien ausgelöst
Ich lese die Dateien in einem Javascript und konvertiere sie in Base64 String und dann versuchen, die Dateien im Controller zu empfangen (mit for-Schleife) und konvertieren sie in Byte-Array.
string fileValue1 = form.GetValues("fileName1");
string fileValue2 = form.GetValues("fileName2");
Der Dateiwert ist vom Format wie unten, abhängig von der Art der Befestigung:
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
die folgenden Teilzeichen Verwenden des Inhalts vor ‚‘ zu entfernen und einige Verarbeitung zu tun vor der Konvertierung es in Byte-Array.
fileValue1 = fileValue1 .Substring(fileValue1 .IndexOf(',') + 1);
fileValue1 = fileValue1 .Trim().Replace(" ", "+");
fileValue1 = Convert.FromBase64String(fileValue1)
Da ich Dateien über mehrere Chargen sende (sagen wir, wenn es 10 Chargen), wird es von rund 150 bis 200 MB Dateien insgesamt versuchen, die Steuerung zu erreichen durch asynchrone AJAX aufruft.
Beim Senden, erhalte ich die folgende Fehlermeldung:
System.OutOfMemoryException was thrown at converting base64 string to byte array - occuring at replace statement.
ich in verschiedene Funktionen für Abhilfe befolgt habe, aber nichts scheint für mich zu arbeiten. Ich habe versucht, "httpRuntime maxRequestLength" und "maxAllowedContentLength" in web.config zu 4 GB zu erhöhen, um riesige Größe zu erlauben, aber nichts scheint zu arbeiten.
Wenn ich die Linie
fileValue1 = fileValue1 .Substring(fileValue1 .IndexOf(',') + 1);
ich unten Störung erhalte entfernen:
The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.
Maximale Größe der Datei kann bis zu 500 MB erreichen, wenn über mehrere Chargen gesendet.
Ich bin nicht sicher, wie diese Zeichenfolge Datei für Block gelesen wird, um sicherzustellen, dass Speicher verfügbar ist, bevor in Byte-Array konvertiert wird. Jede Hilfe würde sehr geschätzt werden.
wahrscheinlich müssen Sie die Konfiguration des Servers ändern Anforderung größer zu akzeptieren oder die Zeit, bevor die Anforderung ablaufen ändern, weil, wenn Sie mehrere Anfrage haben die Server will alle teilnehmen und die Anfrage und der Prozess ist langsam dann die Anfrage ablaufen und Sie erhalten nicht alle Daten – Emiliano
Ich glaube, ich habe die Konfiguration Setup, um größere Anfrage zu akzeptieren. Sobald es den Controller erreicht, schlägt es fehl. Es läuft nicht ab oder dauert länger. – SRS
aber Sie müssen sagen zu dem Server, dass Sie Informationen für eine Weile zu verarbeiten, dann füge ich einen zweiten Link in meiner Antwort – Emiliano