Потоковая передача загруженных файлов непосредственно в таблицу базы данных - PullRequest
2 голосов
/ 16 ноября 2009

У меня есть несколько приложений, которые позволяют пользователям загружать вложения, которые хранятся в таблице базы данных. Это работало отлично в течение нескольких лет, потому что изначально оно предназначалось для небольших файлов изображений, но теперь они хотят загружать очень большие файлы (~ 80 МБ). Это приводит к тому, что серверу не хватает памяти (и загрузка завершается с ошибкой), потому что для записи двоичных данных в базу данных я загружаю весь контент в байтовый массив. Многие, если не большинство, онлайн примеры загрузки файлов используют этот метод (см. http://www.aspnettutorials.com/tutorials/database/Save-Img-ToDB-Csharp.aspx в качестве примера).

Теперь вопрос в том, можно ли каким-то образом передавать двоичный контент в базу данных вместо загрузки всего контента в байтовый массив, а затем установить байтовый массив как параметризованное значение? Переход на файловое, а не базисное хранилище был бы большим делом на этом этапе ...

Ответы [ 4 ]

1 голос
/ 16 ноября 2009

Может быть, эта статья может указать вам правильное направление.

0 голосов
/ 16 ноября 2009

Вам понадобится клиентское приложение (Silverlight, Java-апплет, Flash и т. Д.), Которое разбивает ваш файл на небольшие куски и отправляет его на сервер;

На сервере вам нужно будет вызвать вашу базу данных и сохранить этот чанк; в моих тестах лучшая производительность пришла от UPDATETEXT

Обратите внимание, что вам нужно сделать что-то подобное, чтобы обеспечить загрузку файлов; Я предлагаю прочитать о READTEXT функции, почти такой же, как UPDATETEXT, и использовать ее внутри IHttpAsyncHandler

0 голосов
/ 16 ноября 2009

Вы не предоставляете много информации об используемой вами среде, кроме тегов, которые вы прикрепили к своему сообщению.

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

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

0 голосов
/ 16 ноября 2009

Я не думаю, что было бы целесообразно хранить файлы такого размера в базе данных, особенно путем загрузки (я предполагаю, что загрузка осуществляется через браузер).

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

ОБНОВЛЕНИЕ : Похоже, я ошибся насчет порции. SQL Server поддерживает UPDATETEXT .

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

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