2009-10-21 160 views
6

Necesito cargar archivos grandes de al menos 1GB tamaño de archivo. Estoy usando ASP.Net, C# y IIS 5.1 como mi plataforma de desarrollo.Subir archivos de gran tamaño (1 GB) -ASP.net

estoy usando:

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

antes de usar:

File.WriteAllBytes(filePath, fileByteArray) 

(doesnt ir aquí, pero da System.OutOfMemoryException excepción)

Actualmente yo he dado la httpRuntime a:

executionTimeout = " "maxRequestLength =" "(eso es de 2 GB!) useFullyQualifiedRedirectUrl =" true" minFreeThreads = "8" minLocalRequestFreeThreads = "4" appRequestQueueLimit = "5000" enableVersionHeader = "true" requestLengthDiskThreshold =" 8192"

también me he puesto maxAllowedContentLength="**2097151**" (supongo que es sólo para IIS 7)

he cambiado IIS tiempo de espera de la conexión a 999.999 segundos también.

soy incapaz de subir archivos de hasta 4578KB (Ajaz-Uploader.zip)

Respuesta

0

intente copiar sin cargar cada cosa en la 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

Hola manitra, Intenté usar tus funciones CopyFile() en el cliente y Copy() en el servidor, pero obtuve algunos errores. Otra cosa que he observado es que WriteAllBytes funcionará hasta 3MB de datos, más que eso da "System.Web.Services.Protocols.SoapException: System.Web.Services.Protocols.SoapException: Hubo una excepción ejecutando las extensiones especificado en el archivo de configuración. ---> System.Web.HttpException: la longitud máxima de la solicitud excedió ..... "excepción. –

0

Comprobar this blog entry sobre la carga de archivos grandes. También tiene algunos enlaces a algunos foros de discusión que pueden arrojar algo de luz sobre esto también. La sugerencia es usar HttpHandler personalizado para eso o control Flash/Silverlight personalizado.

3

Busqué en Google y encontré - NeatUpload


Otra solución sería leer los bytes en el cliente y enviarlo al servidor, el servidor guarda el archivo. Ejemplo

Servidor: en el espacio de nombres - Uploader, clase - Subir

[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

No he comprobado el código. No estoy seguro de que esto funcione, solo quería transmitir la idea. Esto es casi lo que hace FTP, excepto que en lugar del puerto 20/21, todo está sucediendo en el puerto 80. –

+0

¡Guau! Estoy tan contento de que hayas mencionado a NeatUpload. Tomé una copia para mí y me facilitó la carga tan fácil de agregar a mi proyecto. Gracias. –

-1

creo que se debe utilizar Response.TransmitFile, este método no se carga en la memoria del servidor web el archivo, se transmite el archivo sin utilizar Web recursos del servidor.

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

¡No abra el archivo en la memoria, quitará el servidor! Con todo respeto, todas las demás soluciones publicadas parecen funcionar con archivos pequeños, pero no con archivos 1Gig –

+0

Este método se puede utilizar al revés, para descargar o cargar archivos grandes, déjame ver si puedo encontrar los documentos –

5

Tenemos una aplicación que de vez en cuando tiene que subir 1 y 2 GB de archivos, por lo que ha estado funcionando en esto también. Después de mucha investigación, mi conclusión es que tenemos que implementar el anteriormente mencionado NeatUpload, o algo así.

También, tenga en cuenta que

<requestLimits maxAllowedContentLength=.../> 

se mide en bytes, mientras

<httpRuntime maxRequestLength=.../> 

se mide en kilobytes. Por lo que sus valores deben parecerse más a esto:

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

Configuración maxRequestLength debería ser suficiente para subir archivos de más de 4 MB, que es el límite predeterminado para el tamaño de la petición HTTP. Asegúrese de que nada anule su archivo de configuración.

Como alternativa, puede consultar async upload provided by Telerik, que carga archivos en trozos de 2 mb y puede evitar la limitación del tamaño de la solicitud ASP.NET.

1

Sé que es una pregunta anterior, pero sigue sin respuesta.

Así que esto es lo que tiene que hacer:

en usted archivo web.config, agregue esto:

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

y esto bajo

<security> 
    <requestFiltering> 

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

    </requestFiltering> 
</security> 

Ves en el comentario cómo funciona esto En uno necesitas tener el sie en bytes y en el otro en kilobytes. Espero que ayude.

Cuestiones relacionadas