C# 如何使用原始文件名作为有效Url发布存储在SQL中的文档?

C# 如何使用原始文件名作为有效Url发布存储在SQL中的文档?,c#,sql,sharepoint,iis,C#,Sql,Sharepoint,Iis,我有一个数据库,它将PDF文档作为字节流存储在varbinary(max)列中,原始文档名存储在带有文档扩展名的varchar列中,主键是guid。(此架构是固定的,文档必须驻留在数据库中) 将文档作为流检索、写入临时文件或直接流式传输到web浏览器都没有问题 我的问题是,如何使用原始文件名通过Url公开文档 我正在尝试做的一个很好的例子是SharePoint,它在后台将文件存储在SQL数据库中,并将文档作为Url(具有原始文件扩展名)公开,可以用浏览器直接打开 例如: (平台为SQL 2008

我有一个数据库,它将PDF文档作为字节流存储在varbinary(max)列中,原始文档名存储在带有文档扩展名的varchar列中,主键是guid。(此架构是固定的,文档必须驻留在数据库中)

将文档作为流检索、写入临时文件或直接流式传输到web浏览器都没有问题

我的问题是,如何使用原始文件名通过Url公开文档

我正在尝试做的一个很好的例子是SharePoint,它在后台将文件存储在SQL数据库中,并将文档作为Url(具有原始文件扩展名)公开,可以用浏览器直接打开

例如:


(平台为SQL 2008、IIS 7.5、.NET 4、C#)

如果您的站点使用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)
    {...
    }
}

您需要在响应中添加
内容处置
标题:

Content-Disposition: attachment; filename=original_name.pdf
请参阅完整示例,其中包含将URL映射到数据库中文件的路由、使用流的高效下载以及使用流的高效上载

布线部分与MVC相对简单:

routes.MapRoute(
                "Media",
                "Media/{filename}",
                new { controller = "Media", action = "GetFile" },
                new { filename = @"[^/?*:;{}\\]+" });
但是其他一些细节,特别是使用正确流式语义的上传,可能比人们通常期望的要复杂一些。大多数示例只是忽略这些问题,并在将整个文件上载到数据库之前创建一个内存中的副本


后续文章将文章扩展到了FILESTREAM存储。

如果不使用MVC,您可以使用称为

这将允许您以任何喜欢的方式处理对url的请求。 您将在web.config中添加代码,如下所示:

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

这描述了如何使用IHttpHandler提供动态内容


我相信这正是你想要的。您将能够根据实际的http请求从数据库加载文档

谢谢大家的精彩回答,我们将做一些测试并分享结果。