Asp.net 将URL导入和存储到Sql数据库中的图像-需要建议

Asp.net 将URL导入和存储到Sql数据库中的图像-需要建议,asp.net,sql-server,image,hierarchical-data,url-scheme,Asp.net,Sql Server,Image,Hierarchical Data,Url Scheme,我在一家公司工作,该公司有数千份文档,大部分是PDF,存储在其Web服务器上的文件夹中。它们主要是用户手册和不同品牌的不同产品的技术文档。它们有一个网页,通过递归遍历文件夹中的所有文档,然后根据文件路径为每个图像生成URL,当前显示指向这些文档的链接 经理担心的是,每当有人更改保存图像的服务器上顶级文件夹的名称时,它基本上会“破坏”代码,因为这些顶级名称在应用程序中是硬编码的。他希望所有的URL都存储在数据库中以缓解这个问题,并让我基本上在SQL数据库中复制web服务器上的当前文件夹结构,然后将

我在一家公司工作,该公司有数千份文档,大部分是PDF,存储在其Web服务器上的文件夹中。它们主要是用户手册和不同品牌的不同产品的技术文档。它们有一个网页,通过递归遍历文件夹中的所有文档,然后根据文件路径为每个图像生成URL,当前显示指向这些文档的链接

经理担心的是,每当有人更改保存图像的服务器上顶级文件夹的名称时,它基本上会“破坏”代码,因为这些顶级名称在应用程序中是硬编码的。他希望所有的URL都存储在数据库中以缓解这个问题,并让我基本上在SQL数据库中复制web服务器上的当前文件夹结构,然后将所有URL都存储到该数据库中。从我所做的研究来看,在关系数据库中实现这样的层次结构并不是一项简单的任务,我不是DBA,我是一名web开发人员


因此,我现在的问题是,我如何才能将当前web服务器上的数千个图像的URL输入到数据库中?我在想,可能只创建一个名为“Brands”的简单表,其中包含品牌的根URL,然后创建另一个名为“Image links”的表或类似的表,然后编写一个小实用程序,简单地遍历所有图像URL并将它们插入到该表中-这听起来像是一种方法吗?

在我看来,您可以使用C#或PowerShell编写的简单命令行程序轻松导入所有文件夹和文件名,它从根开始,迭代所有文件夹和文件。您可以有如下表格:

CREATE TABLE dbo.Folders
(
  FolderID   INT IDENTITY(1,1) PRIMARY KEY,
  ParentID   INT NULL FOREIGN KEY REFERENCES dbo.Folders(FolderID),
  FolderName NVARCHAR(255) NOT NULL
  -- , ... other columns ...
);

CREATE TABLE dbo.Documents
(
  DocumentID INT IDENTITY(1,1) PRIMARY KEY,
  FolderID   INT NOT NULL FOREIGN KEY REFERENCES dbo.Folders(FolderID),
  DocName    NVARCHAR(255) NOT NULL
  -- , ... other columns ...
);
您可以使用类似的内容填充表,这样可以遍历文件夹和文件。您还可以编写一个函数来平展路径,这样在构建路径时就不必遍历整个层次结构-但是基于以上内容,重命名文件夹并始终生成正确的路径而不更新每个文件应该是非常简单的(尽管您必须更改文件夹、更新数据库并保持同步)。仅举一个虚构数据的示例:

INSERT dbo.Folders(ParentID, FolderName) SELECT NULL, 'root';
INSERT dbo.Folders(ParentID, FolderName) SELECT 1, 'sub1';
INSERT dbo.Folders(ParentID, FolderName) SELECT 1, 'sub2';
INSERT dbo.Folders(ParentID, FolderName) SELECT 2, 'subsub1';
INSERT dbo.Folders(ParentID, FolderName) SELECT 4, 'subsubsub1';

INSERT dbo.Documents(FolderID, DocName) SELECT 5, 'foo.pdf';
INSERT dbo.Documents(FolderID, DocName) SELECT 5, 'bar.pdf';
以下是一个函数,它可以在给定DocumentID的情况下展平路径:

CREATE FUNCTION dbo.ShowFullPath
(
    @FolderID INT,
    @DocName  NVARCHAR(255)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @FullPath NVARCHAR(MAX);

    WITH cte AS 
    (
      SELECT FolderID, FolderName, ParentID, rn = 1
        FROM dbo.Folders
        WHERE FolderID = @FolderID
      UNION ALL
      SELECT parent.FolderID, parent.FolderName, parent.ParentID, child.rn + 1
        FROM dbo.Folders AS parent
        INNER JOIN cte AS child
        ON parent.FolderID = child.ParentID
    )
    SELECT @FullPath = STUFF((SELECT '/' + FolderName 
       FROM cte ORDER BY rn DESC 
       FOR XML PATH('')), 1, 1, '')
       + '/' + @DocName
    FROM cte;

    RETURN(@FullPath);
END
GO
因此,当您需要检索给定文档的路径时,您可以在运行时调用该函数(您可以更改函数或添加一个包装器,该包装器采用DocumentID,并提供FolderID和DocName参数),但仅使用计算列进行检索可能更有意义(很遗憾,您将无法持久保存该列)

结果:

DocumentID FolderID DocName FullPath
1          5        foo.pdf root/sub1/subsub1/subsubsub1/foo.pdf
2          5        bar.pdf root/sub1/subsub1/subsubsub1/bar.pdf
或者您可以创建一个视图:

CREATE VIEW dbo.vDocuments
AS
  SELECT DocumentID, FolderID, DocName, dbo.ShowFullPath(FolderID, DocName)
  FROM dbo.Documents;

使用URL重写将请求从新文件夹名称重写为旧文件夹名称。感谢您的回答-这听起来确实是一个很好的方法。但是仍然需要保持数据库与文件夹名称同步,我肯定需要让我的老板知道这一点。您可能需要严格控制谁可以n在Windows中随意修改这些表和/或重命名文件夹。也就是说,您始终可以构建一个主应用程序,该应用程序可以进入并从根目录或任意文件夹完全重建数据库中的表示形式……这可能是将文件本身与存储在数据库中的指针分离时无法避免的一件事。Yo您可以查看FILESTREAM(或SQLServer2012中的FileTable)但我不确定这些是否能更好地满足您的需求。或者您可以建议他投资SharePoint-人们不再从头开始手动构建这些东西是有原因的。哇,感谢您提供了详细的答案和示例。我在前端开发方面相当出色,但不确定我是否能想出那样的SQL代码。我应用程序感谢您的帮助,我会看看我的老板和他的朋友对这种方法的看法。还有Sharepoint想法+1-我的想法完全正确!哈哈
CREATE VIEW dbo.vDocuments
AS
  SELECT DocumentID, FolderID, DocName, dbo.ShowFullPath(FolderID, DocName)
  FROM dbo.Documents;