2010-06-01 2 views
3

В моем веб-приложении я работаю с файлами. Некоторые файлы очень большие. Я использую Response.Write(), чтобы записать файл в браузер. Это подходит для небольших файлов, но для больших файлов это может занять некоторое время, и полоса пропускания полностью используется.Как эффективно отправлять большие файлы из базы данных в браузер?

Можно ли разделить большие документы и отправить их по частям в браузере? Есть ли другие способы быстрее отправить документ в браузер?

Я сохраняю документ как свойство объекта.

ответ

2

Почему вы не сжимаете файл и не храните его в БД и не распаковываете его, извлекая его?

Вы можете сделать много вещей, в зависимости от этого вопросы:

  1. Как часто изменение файла?

  2. Нужны ли мне файлы в БД?

  3. Почему не хранить путь к файлу в базе данных и файл на диске?

Во всяком случае, так как ваши файлы чрезвычайно высокой пропускной способностью, и вы хотите, чтобы ваши приложения, чтобы реагировать соответствующим образом вы можете использовать AJAX загрузить файлы асинхронно. Для этого у вас может быть WebHandler .ashx.

Вот несколько примеров:

http://www.dotnetcurry.com/ShowArticle.aspx?ID=193&AspxAutoDetectCookieSupport=1

http://www.viawindowslive.com/Articles/VirtualEarth/InvokingserversidecodeusingAJAX.aspx

+0

Спасибо, что указали мне на файлы .ashx. Не знал об этом. – Martijn

+0

Без проблем, наслаждайтесь новой игрушкой :) –

0

Я не успеваю с ASP.NET, но вы можете буферизировать из FileStream в какой-то выходной поток.

1

Мой вопрос, можно ли разделить большие документы и отправить его по частям в браузер?

Это зависит от типа файла, но в целом нет. Если вы отправляете что-то вроде файла excel или слова doc и т. Д., Получающее приложение будет нуждаться во всей информации (байтах), чтобы полностью сформировать документ. Вы можете физически разделить документ на несколько, и это позволит вам это сделать.

+0

Я отправляю файлы .mht в браузер. – Martijn

0

Вы можете использовать метод Flush для отправки данных, буферизованных в настоящее время, клиенту (браузеру).

Обратите внимание, что это имеет некоторые последствия, так как описано примерно here.

Я рассмотрел его сам, проект отправил документы, которые стали довольно большими, и я был осторожен в хранении всех данных в памяти. В конце концов я решил, что данные не были достаточно большими, чтобы быть проблемой.

К сожалению, документация MSDN очень и очень расплывчата в отношении того, что подразумевает Flush, и вам, вероятно, придется использовать Google для устранения неполадок.

1

Если полоса пропускания полностью используется, то вы ничего не можете сделать, чтобы «ускорить ее» до сжатия документа перед отправкой. Другими словами, застегните его.

В зависимости от документа (я знаю, что вы сказали .mht, но мы говорим о содержании здесь), вы увидите, что размер уменьшится на некоторую сумму. Может быть, этого достаточно, может быть, нет.

В любом случае, это полностью зависит от количества контента, которое вы хотите отправить, и размера доступного для его отправки. Один из них сложнее изменить, чем другой.

+0

+1: Согласовано. IIS должен уметь справляться с этой проблемой без каких-либо кодовых решений. –

1

Попробуйте установить динамическое сжатие IIS в. По умолчанию он установлен довольно низко, но вы можете попробовать установить его для более высокого уровня сжатия и посмотреть, насколько это помогает.

Смежные вопросы