实施以下方案的最佳方法是什么: 该网站要求存储具有私有和公共图像的图像库。我听说你可以将它们存储在文件层次结构或数据库中。在文件层次结构设置中,如何阻止直接访问图像。在数据库设置中,只能通过网页视图访问图像。什么是有效的解决方案?
[编辑]感谢大家的回复。我决定数据库路由是此应用程序的最佳选择,因为我没有直接访问服务器。限制在webroot文件夹中。所有回复都非常受欢迎。
答案 0 :(得分:2)
使用文件层次结构,您可以将文件放在网站文件夹中,例如,假设网络文件夹是c:/ inetpub / wwwroot / somesite,将文件放在c:/ images /下,以便网页用户将无法访问图像文件。但你不能在你的网站上使用直接链接,你需要创建一些程序来读取文件,返回流。
个人认为最好将文件放在数据库中,仍然创建一些程序来检索二进制图像数据并返回到需要的地方。答案 1 :(得分:2)
使用这两种方法后我会说数据库。如果您将它们存储在文件存储中并且需要保护,那么您必须将它们存储在Web根目录之外,然后使用处理程序(如John提及)来检索它们。编写处理程序直接从数据库中直接传输它们同样容易,并且您可以获得一些优势:
缺点是性能,但你可以使用缓存等来帮助解决这个问题。您还可以使用FILESTREAM storeage in SQL Server 2008(和05?)这意味着您可以通过数据库获得文件系统性能:
“FILESTREAM集成了SQL Server 带有NTFS文件的数据库引擎 存储varbinary(max)的系统 二进制大对象(BLOB)数据为 文件系统上的文件。的Transact-SQL 语句可以插入,更新,查询, 搜索并备份FILESTREAM数据。 Win32文件系统接口提供 流式访问数据。
FILESTREAM使用NT系统缓存 用于缓存文件数据。这有帮助 减少FILESTREAM数据的任何影响 可能在数据库引擎上 性能。 SQL Server缓冲区 没有使用游泳池;因此,这 内存可供查询 处理“。
答案 2 :(得分:1)
实际上两种情况非常相似,所以由你自己决定......数据库不是为了提供文件而设计的,但如果尺寸不是你真正关心的话,我觉得这样做不会有问题它
要回答有关直接访问的问题,您可以像设置数据库一样设置文件图像:您可以使用某种类型的页面(可能是.ashx处理程序)来提供图像,用户和图像之间的逻辑层,以确定它们是否应该访问它。然后,图像所在的实际目录需要a)不是IIS中目录结构的一部分,或b)如果它是IIS的一部分,只允许Windows身份验证访问,并且只允许应用程序进程正在运行的帐户在访问该目录。
答案 3 :(得分:0)
如果您正在使用IIS7,因为.net早期在管道中跳转,我相信您也可以保护jpg文件,只需使用角色管理器并将角色应用于文件系统文件夹即可。如果您正在使用IIS6,我已经做了类似于John的答案,我将实际文件存储在wwwroot之外,并使用处理程序来确定用户是否具有正确的凭据来查看图像。
我会避免使用数据库,除非你有充分的理由这样做 - 而且我认为照片库不是其中之一。
答案 4 :(得分:0)
都不是。 Amazon S3提供了一个非常简单的API来接受上传。您可以使用SimpleDB或SQL数据库来跟踪URL和权限。将整个S3存储桶设置为私有,并使用ASP.NET服务器上的AWS密钥对其进行身份验证。
上传到S3只需要很少的代码,而在SQL中执行bookeeping则需要更多的代码。
一旦他们进入S3,抓住image resizer library和S3 Reader plugin,您可以在一小时内让整个系统运行。并且 - 它将适当扩展。没有磁盘或数据库空间限制。如初。
您可以使用Image Resizer库的AuthorizeImage事件实现授权。如果当前用户不允许访问,则抛出AccessDeniedException。
如果要调整性能,请添加DiskCache和CloudFront插件。 CloudFront可以边缘缓存公共图像(价格低廉),DiskCache将处理私有图像,以静态文件速度提供服务。