У меня есть приложение ASP.NET MVC со страницей, которая позволяет пользователям загружать файлы. Файлы будут составлять несколько сотен мегабайт.
Я использую FineUploader на стороне клиента, который будет использовать FileAPI/XHR, если браузер поддерживает его, в противном случае отпадет в iframe/form с enctype = "multipart whatever".
Итак, на стороне сервера мне нужно оценить Request.Files.Count > 1
. Если true
, это старая школьная загрузка, и я сохраняю файл как Request.Files[0].InputStream.CopyTo(myFileStream)
, иначе я делаю Request.InputStreawm.CopyTo(myFileStream)
.
Вот некоторые из написанного мной кода: https://github.com/ronnieoverby/file-uploader/blob/master/server/ASP.NET%20MVC%20C%23/FineUpload.cs
Все это работает отлично, но в моем тестировании я заметил, что ни действие контроллера ASP.NET MVC, ни HttpHandler не начнут обрабатываться до тех пор, пока весь файл не будет загружен, что плохо, если файл очень большой, потому что это означает занимая много оперативной памяти веб-сервера.
Я нашел это: Потоковая загрузка больших файлов в ASP.NET MVC, которая кажется многообещающей, но я действительно не знаю, где находится код в его приложение.
Итак, возникает вопрос: как выгружать загруженные файлы на диск, пока загрузка все еще происходит в ASP.NET?
Update
Я только что увидел ключевую деталь, которая раньше не погружалась. Из документа HttpPostedFile:
По умолчанию все запросы, включая поля формы и загруженные файлы, размером более 256 КБ буферизуются на диск, а не хранятся на сервере память.
Хорошо, это касается опасений, что использование ОЗУ в сети может всплывать во время большой загрузки. Но все еще проблема: после того, как файл полностью перенесен на веб-сервер, серверу придется потратить время на его перемещение в конечный пункт назначения. Если операция файловой системы является копией (гарантируется, если пункт назначения находится на другом физическом диске), тогда ответ задерживается без необходимости.
Честно говоря, я мог бы, вероятно, жить с этим, увеличивая время отклика для обработчика/действия загрузки. Но было бы неплохо передать байты непосредственно в пункт назначения.