实施以下场景的最佳方法是什么: 该网站要求存储私人和公共图片的图片库。我听说你可以将它们存储在文件层次结构或数据库中。在文件层次结构设置中,如何防止直接访问图像。在数据库设置中,只能通过网页视图访问图像。什么是有效的解决方案?ASP.NET图片上传架构
[编辑]谢谢大家的回复。我决定数据库路由是这个应用程序的最佳选择,因为我没有直接访问服务器。局限于一个webroot文件夹。所有的答复都非常感谢。
实施以下场景的最佳方法是什么: 该网站要求存储私人和公共图片的图片库。我听说你可以将它们存储在文件层次结构或数据库中。在文件层次结构设置中,如何防止直接访问图像。在数据库设置中,只能通过网页视图访问图像。什么是有效的解决方案?ASP.NET图片上传架构
[编辑]谢谢大家的回复。我决定数据库路由是这个应用程序的最佳选择,因为我没有直接访问服务器。局限于一个webroot文件夹。所有的答复都非常感谢。
使用这两种方法我会说数据库。如果你将它们存储在文件存储上并且需要保护,那么你必须将它们存储在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缓冲区 未使用池;因此,这 内存可供查询 处理。”
实际上这两种情况都非常相似,所以取决于您...数据库并非设计用于提供文件,但如果大小不是您真正关心的问题,我不会看到任何问题正在做。
要回答你关于直接访问的问题,你应该像设置数据库一样设置文件映像:你会使用某种类型的页面(可能是一个.ashx处理程序)来提供这些图像,允许你用户和图像之间的一层逻辑,以确定他们是否应该访问它。然后,图像所在的实际目录将需要a)不是IIS中目录结构的一部分,或者b)如果它是IIS的一部分,则只允许Windows身份验证访问,并且只允许应用程序进程运行的帐户在访问目录下。
但是,如果您处于负载平衡的环境中,则需要将服务器指定为资源服务器,或者在服务器之间创建某种重复机制。 – andrewWinn 2009-08-07 20:20:03
使用文件层次结构,可以将文件放到网站文件夹中,例如,假设web文件夹是c:/ inetpub/wwwroot/somesite,将文件放在c:/ images /下,这样网络用户将无法访问图像文件。但是你不能在你的网站中使用直接链接,你需要创建一些程序来读取文件,返回流。
个人我认为最好将文件放入数据库中,仍然创建一些程序来检索二进制图像数据并返回到所需的任何位置。
我打算为这个评论投票,直到你说你认为把文件放在数据库中更好: - 如果你的数据库中存有大量的图片,它会导致严重的性能问题。 – andrewWinn 2009-08-07 20:19:04
我知道有一个限制。但根据我自己的经验,sql服务器处理它相当好...... :-) – Fred 2009-08-07 20:26:51
Andrew,请参阅我的评论re:FILESTREAM存储 - 解决性能问题 – 2009-08-07 20:33:20
如果您使用的是IIS7,由于.NET早期在管道中跳转,我相信您也可以保护jpg文件,只需使用角色管理器并将角色应用于文件系统文件夹即可。如果你使用的是IIS6,我已经做了类似于John的答案,我在那里存储了wwwroot之外的实际文件,并使用一个处理程序来决定用户是否有正确的凭据来查看图像。
我会避免数据库,除非你有很强的理由这样做 - 我不认为照片库是其中之一。
无论是亚马逊S3提供了一个非常简单的API接受上传。您可以使用SimpleDB的或你的SQL数据库来追踪URL和权限。将整个S3斗私,并使用ASP.NET服务器上的AWS密钥来鉴别它。
很少的代码需要上传到S3,很少更将需要在SQL执行bookeeping。
一旦他们进入S3,抓住image resizer library和S3 Reader plugin和y你可以让你的整个系统在一个小时内运行。而且 - 它会正确缩放。没有磁盘或数据库空间限制。永远。
您可以使用Image Resizer库的AuthorizeImage事件来实施授权。如果当前用户不允许访问,只需抛出AccessDeniedException。
如果您想调整性能,请添加DiskCache和CloudFront插件。 CloudFront可以低成本地缓存公共映像,并且DiskCache将处理私有映像,以静态文件速度提供服务。
您使用的数据库是? – RichardOD 2009-08-07 20:29:44