Гость
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Download динамическиформируемого большого файла без буферизации / 15 сообщений из 15, страница 1 из 1
11.03.2019, 12:09
    #39784407
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Download динамическиформируемого большого файла без буферизации
Есть отчет, который по параметрам с формы формирует довольно большой XLSX файл (15-50мб).
для формирования использую родную SDK DocumentFormat.OpenXml. формировать какого угодно большого XLSX-файла без обжорства памяти уже сделано. тут есть задача опубликовать формирование отчета в вебе.
как принято решать задачу отдачи динамически формируемого большого файла в ASP.NET?

1. если просто в Response.OutputStream, потом сделать Flush. то весь файл будет в памяти IIS. такой вариант не подходит.
2. формировать во временный каталог, а потом TransmitFile, но нужно еще делать процедуру очистки файлов с сервака и прогресс скачки начнется после формирования на диске только
3. какой нибудь Response.BinaryWrite с переодическим Flush. как я понял тут проблема что неизвестна длина сразу. попробовал на текстовике (FF вроде сразу предлагает сохранить, а потом показывает что идет закачка, но сколько осталось не знает, что логично. А вот IE 11 ждет полной закачки, а потом дает открыть или сохранить)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
  try
      {
         HttpContext.Current.Response.ContentType = "text/plain;charset=UTF-8";
         Response.ContentType = HttpContext.Current.Response.ContentType;
         Response.AddHeader("content-disposition", "attachment; filename=report.txt");
         Response.BufferOutput = false;
         Response.Buffer = false;
         using (var tw = new System.IO.MemoryStream())
         {
            Response.Write("e0");
            Response.OutputStream.Flush();
            Thread.Sleep(5000);
            Response.Write("e1");
            Response.OutputStream.Flush();
            Thread.Sleep(5000);
            Response.Write("e2");
            Response.TransmitFile
         }
      }
      catch (Exception)
      { }
      finally
      {
         Response.OutputStream.Flush();
         Response.OutputStream.Close();

         Response.End();
      }



как принято поступать? я с вебом не глубоко знаком, прошу совета
...
Рейтинг: 0 / 0
11.03.2019, 13:07
    #39784426
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Download динамическиформируемого большого файла без буферизации
barrabas2. формировать во временный каталоги дать ссылу юзверю. Тогда представление не зависит от отчетника вообще.

barrabasно нужно еще делать процедуру очистки файлов с сервака
Это и есть работа программиста.
...
Рейтинг: 0 / 0
11.03.2019, 13:56
    #39784465
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Download динамическиформируемого большого файла без буферизации
Petro123barrabas2. формировать во временный каталоги дать ссылу юзверю. Тогда представление не зависит от отчетника вообще.

barrabasно нужно еще делать процедуру очистки файлов с сервака
Это и есть работа программиста.

типа юзер на форме выбрал параметры (период и другие фильтры), нажимает показать отчет, а ему станицу со ссылкой чтоли? както не юзерфреднли, он и так уже сказал что хочет файл, зачем ему еще раз на ссылку жать?

сделать то очистку не проблема. просто думал может как-то есть решение динамически пихать в поток файл по мере его создания и это бы.

вариант вроде выглядит рабочим, смущает разное поведение в браузерах (что веб это боль я знаю), не хотелось бы в итоге наткнуться на какуюто хрень, что будет работать не у всех и через раз.

Response.BufferOutput = false;
Response.Buffer = false;
Response.Write("e0");
Response.OutputStream.Flush();
Thread.Sleep(5000);
Response.Write("e1");
Response.OutputStream.Flush();
Thread.Sleep(5000);
Response.Write("e2");

или сразу уж делать через Response.TransmitFile и временный файл
...
Рейтинг: 0 / 0
11.03.2019, 14:25
    #39784482
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Download динамическиформируемого большого файла без буферизации
barrabasтипа юзер на форме выбрал параметры (период и другие фильтры), нажимает показать отчет, а ему станицу со ссылкой чтоли? както не юзерфреднли, он и так уже сказал что хочет файл, зачем ему еще раз на ссылку жать?не жми повторно. В чем проблема? Если есть ссылка, то он хочет ждет. Не хочет, закрыл эксплорер и после обеда нажал.
Ты н post начал делать отчет и канал в ожидании. У него часики.
Если он прервал и опять GET то показал ссылку.
...
Рейтинг: 0 / 0
11.03.2019, 14:27
    #39784484
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Download динамическиформируемого большого файла без буферизации
barrabas,
После POST всегда идет автоматический GET.
Кто и где нажимает 2 раза?
...
Рейтинг: 0 / 0
11.03.2019, 14:33
    #39784487
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Download динамическиформируемого большого файла без буферизации
Petro123barrabas,
После POST всегда идет автоматический GET.
Кто и где нажимает 2 раза?

Я так понял твой пост
Petro123barrabas
2. формировать во временный каталог
и дать ссылу юзверю. Тогда представление не зависит от отчетника вообще.

что типа нужно сгенерировать файл во временный каталог по POST и дать ссылку юзеру (вывести ее на странице), собственно чтобы юзер по ней прошел и получил файл. но пройти по ссылке это же клик по ней.
я неправильно понял что ты хотел сказать?

В моём случае делать нужно будет полюбому через файл, т.к. DocumentFormat.OpenXml внезапно не поддерживает формирование в памяти, только в FileStream, хотя конструктор просит простой стрим и я думал заведется код в Response.OutputStream (.
хотел потестить
...
Рейтинг: 0 / 0
11.03.2019, 14:39
    #39784491
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Download динамическиформируемого большого файла без буферизации
Petro123,

а, типа после формирования файла делать редирект на файл?
лучше чем TransmitFile будет?
...
Рейтинг: 0 / 0
11.03.2019, 14:40
    #39784492
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Download динамическиформируемого большого файла без буферизации
barrabasно пройти по ссылке это же клик по ней.
я неправильно понял что ты хотел сказать?да.
Но кликнуть вместо юзверя это редирект.
...
Рейтинг: 0 / 0
11.03.2019, 14:49
    #39784495
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Download динамическиформируемого большого файла без буферизации
barrabasPetro123,

а, типа после формирования файла делать редирект на файл?
лучше чем TransmitFile будет?универсальнее.
...
Рейтинг: 0 / 0
11.03.2019, 14:56
    #39784502
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Download динамическиформируемого большого файла без буферизации
Petro123barrabasPetro123,

а, типа после формирования файла делать редирект на файл?
лучше чем TransmitFile будет?универсальнее.
попробую, спасибо.
я попробую. смущает что при редиректе светится расположение файлов и имя файла должно быть именно тем какое лежит в каталоге (должен быть добавлен к имени уникальный ключ какой-то, нелья просто report.xlsx сделать).
еще не очень понятно что будет с формой задания параметров после редиректа (тут нужно проверять, я не в теме же), если я делаю редирект, то ухожу со страницы задания параметров, но куда? будет пустая страница и урл файла с адресной строке или страница с параметрами останется и урл тоже?
...
Рейтинг: 0 / 0
11.03.2019, 15:01
    #39784505
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Download динамическиформируемого большого файла без буферизации
barrabas,
Можно редирект на саму себя. Только при GET _всегда_ проверять список готовых отчетов, и если есть вывести их во фрейме где запрашивал.
...
Рейтинг: 0 / 0
11.03.2019, 15:16
    #39784522
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Download динамическиформируемого большого файла без буферизации
ладно буду разбираться.

но чисто для интереса на будущее, например большой XML генерирую или CSV. через поток с отключенным буфером не делают что-ли? какие подводные камни могут быть, если не создать реальный файл?
...
Рейтинг: 0 / 0
11.03.2019, 15:32
    #39784532
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Download динамическиформируемого большого файла без буферизации
barrabas,
Тут не подскажу.
...
Рейтинг: 0 / 0
11.03.2019, 16:28
    #39784573
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Download динамическиформируемого большого файла без буферизации
barrabasкакие подводные камни могут быть, если не создать реальный файл?
проблема может быть с клиентом, неторопливо получающим результат
...
Рейтинг: 0 / 0
11.03.2019, 16:55
    #39784599
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Download динамическиформируемого большого файла без буферизации
Изопропилbarrabasкакие подводные камни могут быть, если не создать реальный файл?
проблема может быть с клиентом, неторопливо получающим результат
логично, спасибо
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Download динамическиформируемого большого файла без буферизации / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]