ASP.NET图像上传体系结构

时间:2009-08-07 19:52:27

标签: asp.net database image-processing upload

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

[编辑]感谢大家的回复。我决定数据库路由是此应用程序的最佳选择,因为我没有直接访问服务器。限制在webroot文件夹中。所有回复都非常受欢迎。

5 个答案:

答案 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 libraryS3 Reader plugin,您可以在一小时内让整个系统运行。并且 - 它将适当扩展。没有磁盘或数据库空间限制。如初。

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

如果要调整性能,请添加DiskCache和CloudFront插件。 CloudFront可以边缘缓存公共图像(价格低廉),DiskCache将处理私有图像,以静态文件速度提供服务。