Как опубликовать документ, хранящийся в SQL, используя исходное имя файла в качестве действительного URL? - PullRequest
4 голосов
/ 22 февраля 2011

У меня есть база данных, в которой документы PDF хранятся в виде потока байтов в столбце varbinary (max). Исходное имя документа хранится в столбце varchar с расширением документа, а первичный ключ - это guid. (Эта схема исправлена, документы должны находиться в базе данных)

Нет проблем с извлечением документа в виде потока и записью во временный файл или потоковой передачей непосредственно в веб-браузер.

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

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

Например: http://WebServer/Documents/MyDocument.pdf

(Платформа - SQL 2008, IIS 7.5, .NET 4, C #)

Ответы [ 4 ]

4 голосов
/ 22 февраля 2011

Если ваш сайт использует ASP.Net MVC, вы можете просто добавить контроллер для / Документы для скачивания файла по имени:

routes.MapRoute(
            "GetFiles",
            "Documents/{fileName}",
            new
            {
                controller = "Files",
                action="GetFile",
            }
        );

И контроллер класса:

    public class FilesController : Controller
{
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult GetFile(string fileName)
    {...
    }
}
2 голосов
/ 22 февраля 2011

Без с использованием MVC вы можете использовать то, что называется IHttpHandler

Это позволит вам обработать запрос к URL любым удобным вам способом. Вы добавите код в ваш файл web.config, например:

<httpHandlers>
        <add verb="*" path="/documents/*.pdf" type="Documents.LoadDocument,NameSpace"/>
    </httpHandlers>

Тогда у вас будет класс Namespace.Documents.LoadDocument Это реализует интерфейс IHttpHandler (всего два метода, и один из них просто bool, который указывает, является ли ваш объект потокобезопасным)

Здесь есть информация , которая описывает, как обслуживать динамический контент с помощью IHttpHandler.

Я верю, что это именно то, что вы ищете. Вы сможете загрузить документ из базы данных на основе фактического http-запроса.

1 голос
/ 22 февраля 2011

См. Загрузка и выгрузка изображений с SQL Server через ASP.Net MVC для полного примера, содержащего маршрутизацию, которая отображает URL-адрес файла в базе данных, эффективную загрузку с использованием потоков, а также эффективную загрузку с использованием потоков.

Часть маршрутизации относительно проста с MVC:

routes.MapRoute(
                "Media",
                "Media/{filename}",
                new { controller = "Media", action = "GetFile" },
                new { filename = @"[^/?*:;{}\\]+" });

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

Последующие действия FILESTREAM MVC: загрузка и выгрузка изображений с SQL Server расширяет статью, чтобы охватить хранилище FILESTREAM.

1 голос
/ 22 февраля 2011

Вам нужно добавить Content-Disposition заголовок к вашему ответу:

Content-Disposition: attachment; filename=original_name.pdf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...