2017-06-29 1 views
1

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.

+0

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

+0

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

+0

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

Antwort

0

wahrscheinlich müssen Sie ändern Sie die Konfiguration Ihres Servers zu akzeptieren Anfrage größer oder ändern Sie die Zeit vor Ablauf der Anfrage, denn wenn Sie mehrere Anfrage haben der Server will alle teilnehmen und die Anfrage und der Prozess ist langsam dann die Anfrage ablaufen und Sie nicht alle Daten empfangen

this Link hilfreich sein kann oder this andere

+0

Ich habe versucht, verschiedene Parameter in der Datei Web.config zu ändern, um sicherzustellen, dass der Server größere Anforderungen akzeptieren kann. Versucht, maxQueryStringLength, executionTimeout-Werte und maxRequestLength zu ändern. Aber immer noch "System.OutOfMemoryException". – SRS

+0

ja, ich glaube dir, aber du änderst das nicht ich sage, ich sage ändern die Zeitüberschreitung des Skripts – Emiliano

+0

überprüfen Sie meine zwei Links bitte – Emiliano

Verwandte Themen