Claro, puedes hacer esto. Ver RESTful file uploads with HttpWebRequest and IHttpHandler. He estado usando este método por algunos años y tengo un sitio que ha sido probado con archivos de al menos varios gigabytes. Básicamente, desea crear su propio IHttpHandler, que es más fácil de lo que parece.
En pocas palabras, se crea una clase que implementa la interfaz IHttpHandler , lo que significa que tiene que soportar la propiedad IsReusable y el método ProcessRequest. Además de eso, hay un pequeño cambio en su web.config, y funciona como un encanto. En esta etapa del ciclo de vida de la solicitud, el archivo completo que se está cargando no se carga en la memoria, por lo que ordena cuidadosamente los problemas de memoria.
Tenga en cuenta que en el web.config,
<httpHandlers>
<add verb="*" path="DocumentUploadService.upl" validate="false" type="TestUploadService.FileUploadHandler, TestUploadService"/>
</httpHandlers>
el archivo referenciado, DocumentUploadService.upl, en realidad no existe. Solo está ahí para dar una extensión alternativa para que la solicitud no sea interceptada por el controlador estándar. Dirige su formulario de carga de archivos a esa ruta, pero luego su clase FileUploadHandler se activa y realmente recibe el archivo.
Actualización: En realidad, el código que uso es diferente de ese artículo, y creo que tropecé con el motivo por el que funciona. Uso la clase HttpPostedFile, en la cual "Los archivos se cargan en formato MIME multipart/form-data. De forma predeterminada, todas las solicitudes, incluidos los campos de formulario y los archivos cargados, mayores de 256 KB se guardan en el disco, en lugar de en la memoria del servidor "
if (context.Request.Files.Count > 0)
{
string tempFile = context.Request.PhysicalApplicationPath;
for(int i = 0; i < context.Request.Files.Count; i++)
{
HttpPostedFile uploadFile = context.Request.Files[i];
if (uploadFile.ContentLength > 0)
{
uploadFile.SaveAs(string.Format("{0}{1}{2}",
tempFile,"Upload\\", uploadFile.FileName));
}
}
}
¿Dónde su código residen en su aplicación? ¿Controlador? ¿entrenador de animales? ¿módulo? –
Sé que esta pregunta es antigua, pero es una muy buena pregunta que estoy usando como referencia para un proyecto en el que estoy trabajando. Pregunta rápida: ¿qué se supone que denotará "cb" en su variable cbRead? – KSwift87
@ KSwift87 'cb' significa" Count of Bytes ", que es la notación húngara estándar de Apps en Fog Creek. –