#c# #asp.net #.net
#c# #asp.net #.net
Вопрос:
Мне нужно передавать большие PDF-файлы (300 МБ — 1 ГБ). Прямо сейчас я загружаю их с sftp-сервера в MemoryStream
, а затем транслирую их в браузер. Он отлично работает для небольших PDF-файлов, но все, что больше 400 МБ, открывает программу просмотра PDF в браузере, индикатор выполнения медленно перемещается к 100%, но PDF никогда не загружается. Если я получаю намного больше 500 МБ, я получаю SystemOutOfMemory
исключения при загрузке. Вот мой соответствующий код
MemoryStream memStream = new MemoryStream();
using (var client = new SftpClient(sftpHost, port, username, password))
{
try
{
client.Connect();
client.ChangeDirectory(envDirectory);
using (memStream)
{
client.DownloadFile(fileName extension, memStream);
httpResponse.Clear();
httpResponse.ClearContent();
httpResponse.ClearHeaders();
httpResponse.Buffer = true;
httpResponse.ContentType = "application/pdf";
httpResponse.AddHeader("Content-Length", memStream.Length.ToString());
memStream.WriteTo(httpResponse.OutputStream);
httpResponse.Flush();
}
}
}
—ОБНОВИТЬ—
Я последовал совету спендера и изменил свой код на
using (var client = new SftpClient(sftpHost, port, username, password))
{
try
{
client.Connect();
client.ChangeDirectory(envDirectory);
httpResponse.Clear();
httpResponse.ClearContent();
httpResponse.ClearHeaders();
httpResponse.Buffer = true;
httpResponse.ContentType = "application/pdf";
client.DownloadFile(fileName extension, httpResponse.OutputStream);
}
Это избавило от исключения нехватки памяти, но большие PDF-файлы по-прежнему начинают загружаться, а затем останавливаются с пустым экраном, меньшие PDF-файлы по-прежнему отлично работают.
SftpClient от https://sshnet.codeplex.com клиент.DownloadFile (имя файла расширение, HttpResponse.OutputStream); возвращает void, но второй параметр — это поток, в который вы хотите сбросить файл.
Любая помощь или лучшие способы сделать это были бы великолепны.
Комментарии:
1. Что это
SftpClient
?2. что возвращает downloadfile?…. ienumerable?… объект?
3. Я обновил основной пост, чтобы ответить на эти
Ответ №1:
Итак, SftpClient
не является частью BCL, поэтому я немного предполагаю, но после того, как вы добавили все заголовки в свой ответ, не могли бы вы просто:
client.DownloadFile(fileName extension, httpResponse.OutputStream);
полностью пропускаете MemoryStream
?
Комментарии:
1. Пропуск MemoryStream избавил от исключений нехватки памяти, но у меня все еще есть проблема с тем, что он не загружает PDF-файлы большего размера. Он начинает загружаться, а затем через некоторое время панель загрузки исчезает, и я остаюсь с пустым экраном.