2009-10-21 18 views
6

Ich muss große Dateien von mindestens 1GB Dateigröße hochladen. Ich verwende ASP.Net, C# und IIS 5.1 als meine Entwicklungsplattform.Hochladen von großen Dateien (1GB) -ASP.net

Ich verwende:

HIF.PostedFile.InputStream.Read(fileBytes,0,HIF.PostedFile.ContentLength) 

vor der Verwendung:

File.WriteAllBytes(filePath, fileByteArray) 

(tut hier gehen, sondern gibt System.OutOfMemoryException Ausnahme)

Zur Zeit habe ich eingestellt das httpRuntime an:

executionTimeout = " "maxRequestLength =" "(das ist 2 GB!) useFullyQualifiedRedirectUrl =" true" minFreeThreads = "8" minLocalRequestFreeThreads = "4" appRequestQueueLimit = "5000" enableVersionHeader = "true" requestLengthDiskThreshold =“ 8192"

auch habe ich gesetzt maxAllowedContentLength="**2097151**" (schätzte sein nur für IIS7)

ich habe zu IIS Verbindung Timeout auf 999.999 Sekunden geändert.

Ich bin nicht in der Lage, Dateien hochzuladen von selbst 4578KB (Ajaz-Uploader.zip)

Antwort

0

Versuchen Kopieren ohne alles, was in den Speicher zu laden:

public void CopyFile() 
{ 
    Stream source = HIF.PostedFile.InputStream; //your source file 
    Stream destination = File.OpenWrite(filePath); //your destination 
    Copy(source, destination); 
} 

public static long Copy(Stream from, Stream to) 
{ 
    long copiedByteCount = 0; 

    byte[] buffer = new byte[2 << 16]; 
    for (int len; (len = from.Read(buffer, 0, buffer.Length)) > 0;) 
    { 
     to.Write(buffer, 0, len); 
     copiedByteCount += len; 
    } 
    to.Flush(); 

    return copiedByteCount; 
} 
+0

Hallo manitra, Ich habe versucht, mit den Funktionen CopyFile() in Client und Copy() in Server, aber ich habe einige Fehler. Eine weitere Sache, die ich beobachtet habe, ist, dass WriteAllBytes bis 3MB Daten arbeiten wird, mehr als es "System.Web.Services.Protocols.SoapException: System.Web.Services.Protocols.SoapException gibt: Es gab eine Ausnahme, die die Erweiterungen ausführt in der Konfigurationsdatei angegeben ---> System.Web.HttpException: Maximale Anforderungslänge überschritten ..... "Ausnahme. –

0

prüfen this blog entry über große Datei-Uploads. Es hat auch ein paar Links zu einigen Diskussionsforen, die das auch beleuchten können. Der Vorschlag ist, benutzerdefinierte HttpHandler für dieses oder benutzerdefinierte Flash/Silverlight-Steuerelement zu verwenden.

3

ich gegoogelt und gefunden - NeatUpload


Eine andere Lösung, die Bytes auf dem Client zu lesen wäre und es an den Server zu senden, der Server die Datei speichert. Beispiel

Server: in Namespace - Uploader, Klasse - Hochladen

[WebMethod] 
public bool Write(String fileName, Byte[] data) 
{ 
    FileStream fs = File.Open(fileName, FileMode.Open); 
    BinaryWriter bw = new BinaryWriter(fs); 
    bw.Write(data); 
    bw.Close(); 

    return true; 
} 

Auftraggeber:

string filename = "C:\..\file.abc"; 
Uploader.Upload up = new Uploader.Upload(); 
FileStream fs = File.Create(fileName); 
BinaryReader br = new BinaryReader(fs); 

// Read all the bytes 
Byte[] data = br.ReadBytes(); 
up.Write(filename,data); 
+1

Ich habe den Code nicht überprüft. Nicht sicher, dass das funktioniert, wollte nur die Idee vermitteln. Dies ist fast das, was FTP tut, außer dass anstelle von Port 20/21 alles über Port 80 geschieht. –

+0

Wow! Ich bin so froh, dass du NeatUpload erwähnt hast. Ich habe eine Kopie für mich selbst gemacht und es hat das Hochladen so leicht gemacht, dass ich es zu meinem Projekt hinzufügen konnte. Vielen Dank. –

-1

Ich glaube, Sie Response.TransmitFile verwenden sollen, ist diese Methode nicht geladen die Datei im Web-Server-Speicher, strömt es die Datei ohne Web zu verwenden Serverressourcen.

+0

Datei nicht im Speicher öffnen, Sie werden den Server herunterfahren !! Mit allem Respekt, scheint alle anderen Lösungen mit kleinen Dateien zu arbeiten, aber nicht mit 1Gig Dateien –

+0

Diese Methode kann rückwärts verwendet werden, zum Download oder zum Hochladen von großen Dateien, lassen Sie mich sehen, ob ich die Dokumente finden kann –

5

Wir haben eine App, die gelegentlich 1 und 2 GB-Dateien hochladen muss, so hat in diesem auch ausgeführt. Nach viel Forschung ist meine Schlussfolgerung, dass wir die zuvor erwähnten NeatUpload oder etwas ähnliches implementieren müssen.

Beachten Sie außerdem, dass

<requestLimits maxAllowedContentLength=.../> 

in Bytes gemessen wird, während

<httpRuntime maxRequestLength=.../> 

in Kilobyte gemessen wird. So sollten Ihre Werte aussehen wie folgt aus:

<httpRuntime maxRequestLength="2097151"/> 
... 
<requestLimits maxAllowedContentLength="2097151000"/> 
0

maxRequestLength Einstellung sollte genug für Dateien größer als 4 MB hochladen, die die Standardlimit für HTTP-Anforderung Größe ist. Bitte stellen Sie sicher, dass nichts Ihre Konfigurationsdatei außer Kraft setzt.

Alternativ können Sie die async upload provided by Telerik überprüfen, die Dateien von 2mb Chunks hochlädt und effektiv die ASP.NET-Anforderungsgrößenbeschränkung umgehen kann.

1

Ich weiß, es ist eine alte Frage, aber immer noch unbeantwortet.

So ist es das, was Sie tun müssen:

In Ihrer web.config Datei, fügen Sie diese in:

<!-- 3GB Files/in kilobyte (3072*1024) --> 
    <httpRuntime targetFramework="4.5" maxRequestLength="3145728"/> 

und dies unter

<security> 
    <requestFiltering> 

     <!-- 3GB Files/in byte (3072*1024*1024) --> 
     <requestLimits maxAllowedContentLength="3221225472" /> 

    </requestFiltering> 
</security> 

Sie im Kommentar sehen wie das funktioniert. In einem müssen Sie die Sie in Byte und in der anderen in Kilobyte haben. Ich hoffe, das hilft.

Verwandte Themen