Лучший способ передать файлы потоком в ASP.NET

Это иногда случается, если пользователь использует Windows 10. Вам может потребоваться установить обновление, чтобы избежать запросов MFA.

Это также может произойти, если какая-либо форма MFA требуется на месте. https://blogs.technet.microsoft.com/cloudpfe/2017/03/15/multiple-mfa-prompts-connecting-to-office-365/

Еще один вариант, чтобы избежать Несколько запросов MFA - помнить MFA для доверенных устройств.

34
задан Faizan Mubasher 27 October 2014 в 06:37
поделиться

4 ответа

Я взял бы вещи за пределами конвейера "aspx". В частности, я записал бы, выполнил обработчик (ashx, или отобразился через конфигурацию), который делает минимум работа и просто пишет в ответ в блоках. Обработчик принял бы вход от строки запроса/формы как нормальный, определил бы местоположение объекта передать потоком, и передать данные потоком (использующий умеренно размерный локальный буфер в цикле). Простой (неполный) пример, показанный ниже:

public void ProcessRequest(HttpContext context) {
    // read input etx
    context.Response.Buffer = false;
    context.Response.ContentType = "text/plain";
    string path = @"c:\somefile.txt";
    FileInfo file = new FileInfo(path);
    int len = (int)file.Length, bytes;
    context.Response.AppendHeader("content-length", len.ToString());
    byte[] buffer = new byte[1024];
    Stream outStream = context.Response.OutputStream;
    using(Stream stream = File.OpenRead(path)) {
        while (len > 0 && (bytes =
            stream.Read(buffer, 0, buffer.Length)) > 0)
        {
            outStream.Write(buffer, 0, bytes);
            len -= bytes;
        }
    }
}
51
ответ дан JohnFx 27 November 2019 в 16:34
поделиться

Смотрите на следующее Отслеживание статьи и Возобновление Больших Загрузок Файла в ASP.NET , который даст Вам больше подробно, чем просто открытый поток и выгонит все биты.

http поддержка протоколов расположилась запросы байта и resumeable загрузки, и многие клиенты потоковой передачи (как видеоплееры или Adobe PDF) могут и пытаться разделить их на блоки, сохраняя пропускную способность и давая Вашим пользователям лучший опыт.

Не тривиальный, но время хорошо потраченное.

10
ответ дан Robert Paulson 27 November 2019 в 16:34
поделиться

Попытайтесь открыть файл как поток, затем с помощью Ответа. OutputStream. Запишите (). Например:

Редактирование: Мое плохое, я забыл, что Запись берет буфер байта. Зафиксированный

byte [] buffer = new byte[1<<16] // 64kb
int bytesRead = 0;
using(var file = File.OpenRead(path))
{
   while((bytesRead = file.Read(buffer, 0, buffer.Length)) != 0)
   {
        Response.OutputStream.Write(buffer, 0, bytesRead);
   }
}
Response.Flush();
Response.Close();
Response.End();

Редактирование 2: Вы пробовали это? Это должно работать.

8
ответ дан bdukes 27 November 2019 в 16:34
поделиться

После попытки большого количества различных комбинаций, включая код, отправленный в различных ответах, это походит на установку Response. Буфер = верный прежде, чем назвать TransmitFile добился цели, и веб-приложение является теперь намного более быстро реагирующим в Internet Explorer.

В данном случае, расширение SWF также отображается на ASP.NET, и мы используем пользовательский обработчик в нашем веб-приложении, чтобы считать файлы из диска и затем отправить их к браузеру с помощью Ответа. TransmitFile (). У нас есть основанный на флэш-памяти видеоплеер для игры видеофайлов, которые являются также SWF's, и я думаю, имея все это действие, проходят обработчик без буферизации, то, что, возможно, вызывало странные вещи произойти в IE.

3
ответ дан Mun 27 November 2019 в 16:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: