代码之家  ›  专栏  ›  技术社区  ›  Mike Cole

正在将文件上载到我的网站

  •  0
  • Mike Cole  · 技术社区  · 16 年前

    我有一个ASP.NET应用程序。我希望用户能够上传文档。我应该把这些文档存储在文件系统的什么地方?用户应该能够上传它们并在站点上看到指向它们的超链接,但是用户A不应该能够看到用户B的文档,但是管理员角色应该能够看到所有这些文档。

    我假设我不想将它们上传到我的Web应用程序的文件夹中,因为这样Web服务器就可以直接为它们提供服务。我不想将文件存储在数据库中,但可以将文件路径存储在数据库中。

    有人请给我一些最佳实践。谢谢!

    5 回复  |  直到 16 年前
        1
  •  2
  •   Greg B    16 年前

    根据文件的大小,一个选项是将文件存储在Web根目录之外,这样就没有人可以热链接到这些文件,然后,正如所建议的那样,生成一个接受一些参数和 Response.WriteFile() 来自所述目录。

    如果文件很大,您可能需要使用 Response.TransmitFile 在服务器上保存一些内存。

    从实现的角度来看,我可能会将文件的真实名称存储在数据库中,以避免命名冲突,并将重命名为guid或从数据库表中获取的整数ID的文件保存在磁盘上。

    然后,将文件写入输出流时,可以使用 content disposition header 将文件重新命名为原始名称。

    嗯!

        2
  •  0
  •   Tomas Aschan    16 年前

    您可能需要一个每个用户有一个文件夹的文件夹结构。你可以自己写 CreateFolder() 方法在创建文件夹后添加 web.config 带有授权规则的文件,仅允许用户和管理员访问。这样,用户只能访问自己的文件,但管理员可以访问所有文件。

    编辑: 为了澄清这一点,我假设您使用的是ASP.NET成员资格功能(尽管不一定完全是这样),它允许您将 Web.CONFIG 目录中的文件,其节点如下所示以控制访问。

    <configuration>
      <system.web>
        <authorization>
          <allow roles="admin" />
          <allow users="TomasLycken" />
          <deny users="*" />
        </authorization>
      </system.web>
    </configuration>
    
        3
  •  0
  •   Tomas Aschan    16 年前

    另一种方法是将所有文件放在一个地方,静态地不允许任何人访问这些文件,然后拥有一个通用的处理程序。( .ashx )它在从数据库中查找URL和权限后为文件提供服务。这可能是一个更清洁的方法,而且它也将占用更少的空间,因为你不会有吨 web.config 文件放在周围…


    注意:我特意将此作为一个单独的答案发布,这样您可以将您喜欢的解决方案标记为您的答案,而忽略另一个。

        4
  •  0
  •   Jeremy    16 年前

    您可以在IIS中创建一个与网站根目录相邻的虚拟目录(作为兄弟目录),这可以做到以下几点:1)通过猜测文件位置,防止用户直接访问文件;2)可以将虚拟目录指向您希望的任何位置;3)在目录浏览关闭的情况下,可以防止任何人看到E结构。然后可以将路径存储在数据库中,进一步从客户机中删除实际结构。

        5
  •  0
  •   bychkov    16 年前

    我已经实现了这样的解决方案。我将文件存储在网站中的受保护(通过web.config节)文件夹中,但我使用guid而不是真正的文件名。我还有一个将guid映射到实名的数据库,还有一些额外的信息,比如文件大小、类型等。在您的例子中,这些信息还可以包含上载文件的用户的名称。 为了下载文件,我实现了HTTP处理程序,该处理程序将获得一个guid参数,并基于文件类型设置适当的HTTP头,并将文件的内容写入响应。在将文件写入响应之前,我还检查了当前用户的权限。然后我有一个页面,它将文件名列表呈现为超链接,指向带有guid参数的HTTP处理程序,该参数对应于受保护文件夹中的特定文件。 为了上传,我使用了非常好的Slickupload控件: http://krystalware.com/Products/SlickUpload/