Конечно, вы можете сделать это. См. Загрузка файлов RESTful с помощью HttpWebRequest и IHttpHandler . Я использую этот метод в течение нескольких лет, и у меня есть сайт, который был протестирован с файлами размером не менее нескольких гигабайт. По сути, вы хотите создать свой собственный IHttpHandler, который проще, чем кажется.
В двух словах, вы создаете класс, который реализует IHttpHandler
интерфейс, что означает, что вы должны поддерживать свойство IsReusable и метод ProcessRequest. Кроме того, в вашем файле web.config есть небольшое изменение, и оно работает как шарм. На этом этапе жизненного цикла запроса весь загружаемый файл не загружается в память, поэтому он аккуратно обходит проблемы с памятью.
Обратите внимание, что в файле web.config,
<httpHandlers>
<add verb="*" path="DocumentUploadService.upl" validate="false" type="TestUploadService.FileUploadHandler, TestUploadService"/>
</httpHandlers>
файл, на который ссылается DocumentUploadService.upl, фактически не существует. Это просто для того, чтобы дать альтернативное расширение, чтобы запрос не был перехвачен стандартным обработчиком. Вы указываете форму загрузки файла на этот путь, но затем ваш класс FileUploadHandler запускается и фактически получает файл.
Обновление: На самом деле, код, который я использую, отличается от той статьи, и я думаю, что наткнулся на причину, по которой он работает. Я использую класс HttpPostedFile , в котором файлы "загружаются в формате MIME multipart / form-data. По умолчанию все запросы, включая поля формы и загруженные файлы размером более 256 КБ, буферизуются в диск, а не хранится в памяти сервера. "
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));
}
}
}