Я хочу передать файл, размещенный в библиотеке документов SharePoint 2003, в браузер. По сути, идея состоит в том, чтобы открыть файл как поток и затем «записать» поток файлов в ответ, указав тип контента и заголовки расположения контента. Расположение содержимого используется, чтобы сохранить имя файла, тип содержимого, конечно, чтобы подсказывать браузеру, какое приложение открыть для просмотра файла.
Это хорошо работает в среде разработки и среде UAT. Однако в производственной среде все не всегда работает должным образом, однако только с IE6 / IE7. FF отлично работает во всех средах.
Обратите внимание, что в производственной среде SSL включен и обычно используется. (Когда SSL не используется в производственной среде, потоки файлов именуются, как и ожидалось, и отображаются правильно.)
Вот фрагмент кода:
System.IO.FileStream fs = new System.IO.FileStream(Server.MapPath(".") + "\\" + "test.doc", System.IO.FileMode.Open);
long byteNum = fs.Length;
byte[] pdfBytes = new byte[byteNum];
fs.Read(pdfBytes, 0, (int)byteNum);
Response.AppendHeader("Content-disposition", "filename=Testme.doc");
Response.CacheControl = "no-cache";
Response.ContentType = "application/msword; charset=utf-8";
Response.Expires = -1;
Response.OutputStream.Write(pdfBytes, 0, pdfBytes.Length);
Response.Flush();
Response.Close();
fs.Close();
Как я уже сказал, этот фрагмент кода отлично работает на компьютере разработчика и в среде UAT. Откроется диалоговое окно с просьбой сохранить, просмотреть или отменить Testme.doc. Но в производстве только при использовании SSL IE 6 и IE7 не используют имя вложения. Вместо этого он использует имя страницы, которая отправляет поток, testheader.apx, а затем выдается ошибка.
IE предоставляет расширенную настройку «Не сохранять зашифрованные страницы на диск».
Я подозреваю, что это является частью проблемы, сервер сообщает браузеру не кэшировать файл, в то время как в IE включена функция "Не сохранять зашифрованные страницы на диск".
Да. Я знаю, что для больших файлов приведенный выше фрагмент кода будет серьезным затягиванием памяти, и это будет проблематично. Таким образом, настоящее окончательное решение не откроет весь файл в одном байтовом массиве, а откроет файл в виде потока, а затем отправит файл клиенту кусками размера кусочка (например, размером примерно 10 КБ).
У кого-нибудь еще есть подобный опыт потоковой передачи двоичных файлов через ssl? Есть предложения или рекомендации?