Загрузить PDF-файл из базы данных на локальный сервер для скачивания

#c# #asp.net #sql

#c# #asp.net #sql

Вопрос:

Я пытаюсь выяснить, как получить файл, который я сохранил в своей базе данных, в файловую систему. Я искал везде, но все, что я могу найти, это как для изображений, извлекающих их и обслуживающих их через Response. Может ли кто-нибудь указать мне направление руководства или предоставить мне какие-либо данные о том, каким путем идти?

Ответ №1:

С точки зрения обслуживания файла через Интернет, процесс для изображений точно такой же, как и для файлов любого типа. Единственным отличием будет тип содержимого в заголовке ответа. (Для PDF это было бы application/pdf .)

Поймите, что по протоколу HTTP абсолютно отсутствует понятие «файлы». Все, что у вас есть, это запросы и ответы, каждый из которых содержит заголовки и данные. Будь то изображение, PDF, веб-страница, что угодно… структура ответа, доставляемого клиенту (браузеру), точно такая же. Заголовки сообщают браузеру, что это за данные, и различные другие метаданные о них, а данные — это просто исходные данные отправляемого «файла». Браузер может выбирать, что делать с данными.

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

Редактировать: В ответ на ваш комментарий к ответу @Pete M…

Процесс по-прежнему очень похож. «Файлы» в виде вложений электронной почты работают почти так же, как «файлы» по HTTP. По сути, все, что вам нужно, это поток данных и тип содержимого. При сборке MailMessage объекта взгляните на Attachment объект. Когда вы извлекаете свой PDF-файл из базы данных (точно так же, как при извлечении изображений из базы данных для отправки в клиент браузера), установите поток данных на ContentStream для объекта вложения. Затем также установите ContentType (снова application/pdf ) и Name MailMessage на объект вложения, и вы должны иметь возможность отправлять его как часть в,,.

Возможно, вам также потребуется установить дополнительные параметры на Attachment . Тестирование покажет, насколько четко вам нужно обращаться с такими вещами, как кодирование. Если вы можете поделиться каким-либо кодом при попытке этого, мы можем помочь вам с этим кодом.

Ответ №2:

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

Могу я спросить, почему вы это делаете? Если это для кэширования, чтобы вы могли вернуть его пользователям, которые запрашивают его, я бы сначала рассмотрел другие варианты. Необходимость погружения в диск часто приводит к снижению производительности.

Комментарии:

1. Мне нужно отправить PDF-файл людям по электронной почте, поэтому в основном я создаю электронное письмо, которое они заполняют получателю, а затем оно прикрепляет файлы из базы данных и затем отправляет его. Должен ли я подходить к этому по-другому?

2. Для начала я бы вообще не стал кэшировать, если бы у меня не было проблем с производительностью. Будет ли это достаточно сложно, чтобы оправдать перенос файла и его сохранение? Если нет, просто извлеките его из базы данных и прикрепите напрямую. Вам не обязательно сначала загружать его в файловую систему. Вот ссылка, объясняющая, как создать вложение непосредственно из потока: systemnetmail.com/faq/3.4.2.aspx

3. Если вам действительно нужно кэшировать, я бы предпочел сохранить кэш-память, чем обращаться к диску. Если файл ОЧЕНЬ большой, я могу обратиться к диску по необходимости, но только в крайнем случае.