Экспорт больших объемов данных клиенту в asp.net - PullRequest
5 голосов
/ 08 мая 2009

Мне нужно экспортировать большой объем данных (~ 100 МБ) из таблицы sql пользователю через Интернет. Что было бы лучшим решением для этого? Одна мысль заключалась в том, чтобы экспортировать данные в папку на сервере базы данных, сжать их (каким-то образом), а затем предоставить пользователю ссылку для скачивания. Есть ли другие способы сделать это? Кроме того, мы можем сжать данные из сервера SQL?

Любые подходы приветствуются.

Ответы [ 5 ]

4 голосов
/ 23 мая 2009

Я бы не связывал базу данных, ожидая, пока пользователь загрузит 100 МБ, даже для высокоскоростного пользователя. Когда пользователь запрашивает файл, попросите его указать адрес электронной почты. Затем вызовите асинхронный процесс, чтобы извлечь данные, записать их во временный файл (в конце концов, не нужно> 100 МБ памяти), затем заархивировать временный файл в место хранения, а затем отправить пользователю электронное письмо со ссылкой для загрузки. файл.

3 голосов
/ 08 мая 2009

Вы можете ответить на запрос страницы файлом:

Response.AddHeader("Content-Disposition", 
    "attachment; filename=yourfile.csv");
Response.ContentType = "text/plain";

Обязательно отключите буферизацию, чтобы IIS мог начать отправку первой части файла во время создания второй:

Response.BufferOutput = false;

После этого вы можете начать писать файл как:

Response.Write("field1,field2,field3\r\n");

Когда файл полностью записан, завершите ответ, чтобы ASP.NET не добавлял веб-страницу в ваш файл:

Response.End();

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

Если требуется сжатие, вы можете написать ZIP-файл таким же образом. Это хорошая бесплатная библиотека для создания ZIP-файлов.

0 голосов
/ 08 мая 2009

Ваш подход работает отлично. SSIS + 7zip может быть полезен для автоматизации процесса, если вам нужно сделать это несколько раз.

0 голосов
/ 08 мая 2009

Если XML в порядке, один из подходов состоит в том, чтобы выбрать данные «FOR XML» следующим образом: http://www.sqljunkies.ddj.com/Article/296D1B56-8BDD-4236-808F-E62CC1908C4E.scuk

А затем выкладываете необработанный XML прямо в браузер как content-type: text / xml. Также обязательно установите сжатие Gzip на вашем веб-сервере для файлов с расширениями XML. http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/502ef631-3695-4616-b268-cbe7cf1351ce.mspx?mfr=true

Это сократит XML-файл до 1/3 или, возможно, до 1/4 размера при его передаче. Это не будет лучшим вариантом производительности из-за присущего потраченного пространства в XML-файлах, но многое зависит от того, какой формат вы ищете в итоге.

Другой вариант - использовать бесплатный CSharpZipLib для сжатия XML (или любого другого формата, который вы хотите) в zip-файл, который будет загружать пользователь. Вдобавок к этому, если это то, что будет часто использоваться, вы можете захотеть изучить кеширование и хранение zip-файла на веб-сервере с некоторым сроком действия, чтобы он не создавался заново для каждого отдельного запроса.

0 голосов
/ 08 мая 2009

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

Я бы предложил не применять сжатие в движке SQL Server. Вместо этого посмотрите на библиотеку DotNetZip (или System.IO.Conpression, если вы считаете, что ваши пользователи имеют возможность распаковывать архивы gzip) и реализуйте сжатие в веб-приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...