2009-08-07 58 views
1

实施以下场景的最佳方法是什么: 该网站要求存储私人和公共图片的图片库。我听说你可以将它们存储在文件层次结构或数据库中。在文件层次结构设置中,如何防止直接访问图像。在数据库设置中,只能通过网页视图访问图像。什么是有效的解决方案?ASP.NET图片上传架构

[编辑]谢谢大家的回复。我决定数据库路由是这个应用程序的最佳选择,因为我没有直接访问服务器。局限于一个webroot文件夹。所有的答复都非常感谢。

+0

您使用的数据库是? – RichardOD 2009-08-07 20:29:44

回答

2

使用这两种方法我会说数据库。如果你将它们存储在文件存储上并且需要保护,那么你必须将它们存储在web-root之外,然后使用处理程序(如John提到的)来检索它们。这是容易写一个处理程序,以串流从数据库的直接,你会得到一些好处:

  • 有了数据库,您不必担心文件存储权限或生成唯一的文件名或文件夹层次结构等
  • 使用数据库,您可以轻松地直接应用权限和保护 - 不会试图弄清楚谁可以查看基于路径的内容等。
  • 与数据库可以存储图像和元数据都在一起 - 当你删除您删除的图像元数据 - 但没有孤立的记录,你从数据库中删除的可能性不是从文件存储
  • 更容易备份数据库图像,然后恢复

缺点是性能,但你可以使用缓存等来帮助。您还可以使用FILESTREAM storeage in SQL Server 2008,这意味着你的文件系统的性能,但通过DB(05):

“FILESTREAM 系统通过存储的varbinary(最大值)集成了一个NTFS文件在SQL Server 数据库引擎 二进制大对象(BLOB)数据作为文件系统上 文件。的Transact-SQL 语句可以插入,更新,查询, 搜索和备份FILESTREAM数据。 Win32文件系统接口提供 流对数据的访问。

FILESTREA M使用NT系统缓存 来缓存文件数据。这有助于减少FILESTREAM数据 对数据库引擎 性能可能产生的影响。 SQL Server缓冲区 未使用池;因此,这 内存可供查询 处理。”

1

实际上这两种情况都非常相似,所以取决于您...数据库并非设计用于提供文件,但如果大小不是您真正关心的问题,我不会看到任何问题正在做。

要回答你关于直接访问的问题,你应该像设置数据库一样设置文件映像:你会使用某种类型的页面(可能是一个.ashx处理程序)来提供这些图像,允许你用户和图像之间的一层逻辑,以确定他们是否应该访问它。然后,图像所在的实际目录将需要a)不是IIS中目录结构的一部分,或者b)如果它是IIS的一部分,则只允许Windows身份验证访问,并且只允许应用程序进程运行的帐户在访问目录下。

+0

但是,如果您处于负载平衡的环境中,则需要将服务器指定为资源服务器,或者在服务器之间创建某种重复机制。 – andrewWinn 2009-08-07 20:20:03

2

使用文件层次结构,可以将文件放到网站文件夹中,例如,假设web文件夹是c:/ inetpub/wwwroot/somesite,将文件放在c:/ images /下,这样网络用户将无法访问图像文件。但是你不能在你的网站中使用直接链接,你需要创建一些程序来读取文件,返回流。

个人我认为最好将文件放入数据库中,仍然创建一些程序来检索二进制图像数据并返回到所需的任何位置。

+0

我打算为这个评论投票,直到你说你认为把文件放在数据库中更好: - 如果你的数据库中存有大量的图片,它会导致严重的性能问题。 – andrewWinn 2009-08-07 20:19:04

+1

我知道有一个限制。但根据我自己的经验,sql服务器处理它相当好...... :-) – Fred 2009-08-07 20:26:51

+0

Andrew,请参阅我的评论re:FILESTREAM存储 - 解决性能问题 – 2009-08-07 20:33:20

0

如果您使用的是IIS7,由于.NET早期在管道中跳转,我相信您也可以保护jpg文件,只需使用角色管理器并将角色应用于文件系统文件夹即可。如果你使用的是IIS6,我已经做了类似于John的答案,我在那里存储了wwwroot之外的实际文件,并使用一个处理程序来决定用户是否有正确的凭据来查看图像。

我会避免数据库,除非你有很强的理由这样做 - 我不认为照片库是其中之一。

0

无论是亚马逊S3提供了一个非常简单的API接受上传。您可以使用SimpleDB的或你的SQL数据库来追踪URL和权限。将整个S3斗私,并使用ASP.NET服务器上的AWS密钥来鉴别它。

很少的代码需要上传到S3,很少更将需要在SQL执行bookeeping。

一旦他们进入S3,抓住image resizer libraryS3 Reader plugin和y你可以让你的整个系统在一个小时内运行。而且 - 它会正确缩放。没有磁盘或数据库空间限制。永远。

您可以使用Image Resizer库的AuthorizeImage事件来实施授权。如果当前用户不允许访问,只需抛出AccessDeniedException。

如果您想调整性能,请添加DiskCache和CloudFront插件。 CloudFront可以低成本地缓存公共映像,并且DiskCache将处理私有映像,以静态文件速度提供服务。