получение изображений из mssql в C # с использованием потоков - PullRequest
4 голосов
/ 13 сентября 2010

У меня есть база данных, в которой изображения .png хранятся в формате sql «image».У меня есть код, который извлекает эти изображения в виде байта [] и отправляет их на страницу через объект FileContentResult в .Net.Производительность является ключевым фактором в этом приложении, и изображения должны быть извлечены и отображены как можно быстрее.Мой вопрос заключается в том, может ли эта операция выполняться быстрее, передавая поток байтов из базы данных в браузер, а не хранить в памяти весь байтовый массив.Если это возможно и стоит сделать, как мне это сделать?

Вот код, который у меня есть:

// Get: /Image/Get/5
        public FileResult Get(int id)
        {


            Response.Cache.SetExpires(DateTime.Now.AddSeconds(300));
            Response.Cache.SetCacheability(HttpCacheability.Public);
            Response.Cache.SetValidUntilExpires(true);

            // Get full size image by PageId.
            return base.File(page.getFullsizeImage(id), "image/png");
        }

И

public byte[] getFullsizeImage(int pageId)
        {


                    return (from t in tPage
                            // Filter on pageId.
                            where t.PageId == pageId
                            select t.Image).Single().ToArray();


        }

Спасиболюбая помощь!

Ответы [ 3 ]

1 голос
/ 13 сентября 2010

Изменение linq с одиночного на первое должно дать вам более приятный SQL, если PageId является первичным ключом, который вы можете смело предположить первым, и single выдаст тот же результат.

1 голос
/ 13 сентября 2010

Хороший вопрос.

Реальность - это код, необходимый для отправки изображения в виде потока, действительно минимальный.Это всего лишь Response.Write ~~~ байтовый массив и установка заголовка типа содержимого HTTP, который должен быть очень быстрым.

Теперь вам, похоже, нужно открыть свою базу данных для всего мира, чтобы сделать это быстрее.Это, вероятно, возможно с использованием функций, которые позволяют SQL-серверу обслуживать HTTP / взаимодействовать с IIS (давно я на это смотрел), не очень хорошая идея, поэтому я не верю, что вы должны идти на такой риск.

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

Но нужно сделать только один локальный кэш файлов на IIS , и если используется изображение, оно записывается в файл на веб-сервере ис этого момента (до, возможно, на следующий день, когда это будет очищено) будет возвращен этот другой URL-адрес (к статическому ресурсу ), чтобы запросы не проходили через уровень ASP.NET.Это не очень хорошая идея, но она достигнет того, что вам нужно, с наименьшим риском.

1 голос
/ 13 сентября 2010

Редактировать: Исходя из ваших комментариев, я думаю, вы должны рассмотреть возможность использования DeepZoom от Microsoft. По сути, это позволяет вам генерировать специализированный файл изображения на сервере. Когда пользователь просматривает изображение в полноэкранном режиме, только пара миллионов или около того пикселей, отображаемых на экране, отправляются в браузер через AJAX. Затем, когда пользователь увеличивает масштаб изображения, соответствующие пиксели для уровня масштабирования и осей x и y вытягиваются. Существует DeepZoom Composer , к которому можно получить доступ через командную строку, чтобы сгенерировать эти файлы изображений по требованию и записать их в общий сетевой ресурс. Ваши пользователи будут действительно впечатлены.

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

Конец редактирования

У вас должны быть изображения с большим размером файла? Если они предназначены только для отображения в браузере, они должны быть оптимизированы для Интернета . Все основные приложения для редактирования изображений имеют эту возможность.

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

В Фотошопе задание «Сохранить для Интернета». Существует одноименный плагин для Gimp.

Я знаю, что это не отвечает на ваш прямой вопрос («может ли эта операция выполняться быстрее, передавая поток байтов»), но это может помочь решить вашу проблему.

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