2009-10-21 44 views
6

Ho bisogno di caricare file di dimensioni di almeno 1GB. Sto usando ASP.Net, C# e IIS 5.1 come piattaforma di sviluppo.Carica file di grandi dimensioni (1 GB) -ASP.net

sto usando:

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

prima di utilizzare:

File.WriteAllBytes(filePath, fileByteArray) 

(doesnt andare qui, ma dà System.OutOfMemoryException eccezione)

Attualmente ho impostato il httpRuntime a:

executionTimeout = " "maxRequestLength =" "(questo è da 2 GB!) useFullyQualifiedRedirectUrl =" true" minFreeThreads = "8" minLocalRequestFreeThreads = "4" appRequestQueueLimit = "5000" enableVersionHeader = "true" requestLengthDiskThreshold =" 8192"

anche io ho posto maxAllowedContentLength="**2097151**" (indovinate il suo solo per IIS7)

ho cambiato IIS timeout di connessione a 999.999 secondi troppo.

non sono in grado di caricare i file di anche 4578KB (Ajaz-Uploader.zip)

risposta

0

provare a copiare senza caricare ogni cosa nella memoria:

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

Ciao manitra, Ho provato a utilizzare le funzioni CopyFile() nel client e Copy() nel server, ma ho ricevuto alcuni errori. Un'altra cosa che ho osservato è che WriteAllBytes funzionerà fino a 3MB di dati, più di quello che fornisce "System.Web.Services.Protocols.SoapException: System.Web.Services.Protocols.SoapException: C'è stata un'eccezione nell'esecuzione delle estensioni specificato nel file di configurazione. ---> System.Web.HttpException: lunghezza massima richiesta superata ..... "eccezione. –

0

check this blog entry su grandi upload di file. Ha anche alcuni link ad alcuni forum di discussione che possono far luce su questo. Il suggerimento è di utilizzare HttpHandler personalizzato per il controllo Flash/Silverlight personalizzato o personalizzato.

3

Googled e trovato - NeatUpload


Un'altra soluzione sarebbe quella di leggere i byte sul client e inviarlo al server, il server salva il file. Esempio

Server: in Namespace - Uploader, classe - Upload

[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; 
} 

Cliente:

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

Non ho controllato il codice. Non sono sicuro che funzioni, volevo solo trasmettere l'idea. Questo è quasi ciò che fa FTP, tranne che al posto della porta 20/21, tutto sta accadendo sulla porta 80. –

+0

Wow! Sono così contento che tu abbia menzionato NeatUpload. Ho preso una copia per me e ha reso il caricamento così facile per me da aggiungere al mio progetto. Grazie. –

-1

Credo che si dovrebbe usare Response.TransmitFile, questo metodo non viene caricata nella memoria del server Web il file, flussi di file senza l'utilizzo di web risorse del server.

if (Controller.ValidateFileExist()) 
     { 
      ClearFields(); 
      Response.Clear(); 
      Response.ContentType = "text/plain"; 
      Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", "FileNAme.Ext")); 
      Response.TransmitFile(FileNAme.Ext); 
      Response.End(); 
      Controller.DeleteFile(); 
     } 
+0

Non aprire il file in memoria, verrà rimosso il server !! Con tutto il rispetto, tutte le altre soluzioni pubblicate sembrano funzionare con file piccoli, ma non con file 1Gig –

+0

Questo metodo può essere utilizzato all'indietro, per scaricare o caricare file di grandi dimensioni, fammi vedere se riesco a trovare i documenti –

5

Abbiamo un'app che occasionalmente ha bisogno di caricare file da 1 e 2 GB, così è stato eseguito anche in questo. Dopo molte ricerche, la mia conclusione è che dobbiamo implementare il già citato NeatUpload o qualcosa del genere.

Inoltre, essere consapevoli che

<requestLimits maxAllowedContentLength=.../> 

è misurato in byte , mentre

<httpRuntime maxRequestLength=.../> 

è misurato in kilobyte . Quindi, i valori dovrebbero guardare più in questo modo:

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

impostazione maxRequestLength dovrebbe essere sufficiente per il caricamento di file più grandi di 4 MB, che è il limite predefinito per la richiesta HTTP dimensioni. Assicurati che nulla stia sovrascrivendo il tuo file di configurazione.

In alternativa è possibile controllare lo async upload provided by Telerik, che carica i file di blocchi da 2mb e può effettivamente bypassare la limitazione della dimensione delle richieste ASP.NET.

1

So che è una vecchia domanda, ma ancora senza risposta.

Quindi questo è quello che devi fare:

In te file web.config, aggiungere questo in:

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

e questo sotto

<security> 
    <requestFiltering> 

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

    </requestFiltering> 
</security> 

Si vede nel commento come funziona In uno devi avere la sie in byte e nell'altra in kilobyte. Spero possa aiutare.

Problemi correlati