Потоковая передача больших PDF-файлов с использованием .net и sftp-сервера

#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-файлы большего размера. Он начинает загружаться, а затем через некоторое время панель загрузки исчезает, и я остаюсь с пустым экраном.