我有一个ASP.NET应用程序。我希望用户能够上传文件。我应该在文件系统中的哪些地方存储这些文件?用户应该能够上传它们并在网站上看到它们的超链接,但UserA不应该能够看到UserB的文档,但是管理员角色应该能够看到所有这些文档。
我假设我不想将它们上传到我的Web应用程序的文件夹,因为Web服务器可以直接为它们提供服务。我不想将文件存储在数据库中,但我可以在数据库中存储文件路径。
有人请给我一些最佳实践。谢谢!
答案 0 :(得分:2)
根据文件的大小,一个选项是将文件存储在Web根目录之外,这样就没有人可以热链接到它们,然后,正如所建议的那样,生成一个带有一些参数的页面{{{ 3}}来自所说的目录。
如果文件很大,您可能希望使用Response.WriteFile()来保存服务器上的某些内存。
从实现的角度来看,我可能会将文件的真实名称存储在数据库中,以避免命名冲突,并将重命名的磁盘上的文件保存为类似GUID的文件,或者只保存从数据库表中获取的整数ID。
然后,当您将文件写入输出流时,可以使用Response.TransmitFile将文件重命名为原始名称。
HTH!
答案 1 :(得分:0)
您可能想要一个文件夹结构,每个用户只有一个文件夹。您可以编写自己的CreateFolder()
方法,在创建文件夹后添加一个带有授权规则的web.config
文件,只允许用户和管理员访问它。这样,用户只能访问自己的文件,但管理员可以访问所有文件。
编辑:为了澄清 - 我假设您正在使用ASP.NET成员资格功能(尽管不一定完全一样),这样您就可以将单个web.config
文件放入具有下面显示的节点的目录来控制访问。
<configuration>
<system.web>
<authorization>
<allow roles="admin" />
<allow users="TomasLycken" />
<deny users="*" />
</authorization>
</system.web>
</configuration>
答案 2 :(得分:0)
另一种方法是将所有文件放在一个地方,静态地允许任何人访问,然后有一个通用处理程序(.ashx
)在查找url后提供文件和数据库的权限。这可能是一种更清洁的方法,它也会占用更少的空间,因为你不会有大量的web.config
文件......
注意:我故意将此作为单独的答案发布,因此您可以将您喜欢的解决方案标记为答案而忽略另一个答案。
答案 3 :(得分:0)
我已经实现了这样的解决方案。我将文件存储在网站的受保护(通过web.config部分)文件夹中,但我使用guids而不是真正的文件名。我还有一个数据库,它将guid映射到实名,并有一些额外的信息,如文件大小,类型等。在您的情况下,此信息还可能包含上载文件的用户的名称。 为了下载文件,我实现了HTTP处理程序,它将获得一个guid参数,并根据文件类型设置适当的HTTP头,并将文件内容写入响应。在将文件写入响应之前,我还检查当前用户的权限。然后我有一个页面,将文件名列表呈现为超链接,指向此HTTP处理程序,其guid参数对应于受保护文件夹中的特定文件。 对于上传,我使用了非常好的SlickUpload控件: http://krystalware.com/Products/SlickUpload/
答案 4 :(得分:0)
您可以在IIS中创建一个与您网站根目录相邻(作为兄弟)的虚拟目录,这可以做一些事情1)它可以防止用户通过猜测文件位置直接访问文件,2)您可以指向虚拟目录到你想要的任何位置,3)关闭目录浏览你可以阻止任何人看到结构。然后,您可以将路径存储在数据库中,从而从客户端中删除实际结构。